PDA

View Full Version : گرافیک مشکل رسم اشکال غیر هندسی



NIMA_1981
چهارشنبه 28 اردیبهشت 1390, 21:28 عصر
سلام دوستان

من قبلا یک تاپیک زده بودم که برای ترسیم اشکال غیر هندسی مثل این شکل
http://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Hypergraph-wikipedia.svg/262px-Hypergraph-wikipedia.svg.png

حالا من با استفاده از دستور FillClosedCurveاین حور شکلی رو ایجاد میکنم
http://up.iran-ps.com/images/469tt2.jpg
اما این جور ترسم ها جند تا مشکل در زمان کار با برنامه ایجاد میکنه
1- وقتی که دو نقطه داشه باشی کلا هیچ شکلی نمیکشه
2- اگه 3 نقطه در یک خط قرار بگیره یک خط باریک میکشه مثل این شکل
http://up.iran-ps.com/images/294tt3.jpg

3- و مشگل اصلی اینکه وقتی نقطه ها از 3 تا بالا تر میره یک سری شکل های مختلف میکشه مثل این شکل
http://up.iran-ps.com/images/529tt5.jpg

خالا میشه راهنمایی کنید که باید چطوری این کارو انجام بدم که برای همه نقطا تقربا مثل همنون عکس اول که برای 3 تا نقطه هست را رسم کنه یا یه چیری مثل عکس اول

با تشکر

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 08:59 صبح
یک سوال دیگه کلا میشه این جور الگوریتمی برای رسم همچنین شکل های نوشت -یک راه حل به من بدید لطفا

Saeed.Masoumi
پنج شنبه 29 اردیبهشت 1390, 12:48 عصر
سلام
خوب دوست عزیز شما بفرمایید از چه روشی استفاده می کنید مشکلتون در رسم Arc است یا ... توضیحاتتون کافی نیست کشیدن اون شکل ها کاره سختی نیست شما بگویید تا کجا و با چه دستوراتی پیش رفته اید بقیش رو بهتون کمک می کنیم .
یعنی چی الگوریتم خواصی دارد؟

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 16:41 عصر
ببنید دوست من شاید من منظورم رو بد گفتم -من یک نرم افزار برای Graph و hypergraph دارم مینویسم حالا ابتدا میام یک سری نقطه توس صفخه قرار میدم که هر کدوم مختصات خاص خودشو داره - بعد توی قسمت hypergraph میام چند تا نقطه را اتخاب میکنم که اینا با هم یک hypergraph را تشکیل میدن مثل همون عکس اول که هر رنگ نماینگر یک hypergraph است - حالا من توی روش که تو برنامه استفاده کردم مشکلات بالا بر میخورم -من تقریبا یک شکلی مثل این شکل میخوام
http://upload.wikimedia.org/wikipedia/commons/thumb/5/57/Hypergraph-wikipedia.svg/262px-Hypergraph-wikipedia.svg.png
و یا تقریبا مثل شکل بالا





GraphicsPath path = new GraphicsPath();
path.AddLines(pt1.ToArray());
g.FillClosedCurve(test2, path.PathPoints);



با تشکر

Saeed.Masoumi
پنج شنبه 29 اردیبهشت 1390, 18:43 عصر
من فکر می کنم شما point ها تون رو به ترتیب به دستور FillClosedCurve تحویل نمی دهید چون از path.PathPoints استفاده می کنید ترتیب نقاط بهم می خورد الان من این دو دستور رو استفاده می کنم و درست جواب می دهد:
Point[] p=new Point[]{new Point(50,10),new Point(20,50),new Point(80,50)};
Brush b = Brushes.Brown;
g.FillClosedCurve(b,p);
این همون مثلث رو می سازه که درست هم هست همانطور که انتظار دارم.
این یکی هم مربعی رسم می کند که انتظار دارم:
Point[] p = new Point[] { new Point(50, 100), new Point(200, 100), new Point(200, 200), new Point(50, 200) };
Brush b = Brushes.Brown;
g.FillClosedCurve(b, p);
این کد ها رو تست کنید شاید منظورتون همین باشه.و شما در ترتیب نقاط ورودی مشکل دارید این نکته رو هم توجه کنید که اگر نقطه اول و آخر رو یکی ندهید خودش نقطه آخر را به اولین نقطه ای که در داخل آرایه وجود دارد وصل می کند.
شایدم باز هم متوجه نشده باشم.!

morteza271
پنج شنبه 29 اردیبهشت 1390, 19:02 عصر
سلام دوستان.
من ازین کدهایی که شما نوشتین سردر نمیارم میشه برام توضیح بدین؟ممنون میشم.
من کدهاتون رو کپی کردم ولی g رو نمیشاسه باید چیکار کنم؟
با تشکر...

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 19:29 عصر
من فکر می کنم شما point ها تون رو به ترتیب به دستور FillClosedCurve تحویل نمی دهید چون از path.PathPoints استفاده می کنید ترتیب نقاط بهم می خورد الان من این دو دستور رو استفاده می کنم و درست جواب می دهد:
Point[] p=new Point[]{new Point(50,10),new Point(20,50),new Point(80,50)};
Brush b = Brushes.Brown;
g.FillClosedCurve(b,p);
این همون مثلث رو می سازه که درست هم هست همانطور که انتظار دارم.
این یکی هم مربعی رسم می کند که انتظار دارم:
Point[] p = new Point[] { new Point(50, 100), new Point(200, 100), new Point(200, 200), new Point(50, 200) };
Brush b = Brushes.Brown;
g.FillClosedCurve(b, p);
این کد ها رو تست کنید شاید منظورتون همین باشه.و شما در ترتیب نقاط ورودی مشکل دارید این نکته رو هم توجه کنید که اگر نقطه اول و آخر رو یکی ندهید خودش نقطه آخر را به اولین نقطه ای که در داخل آرایه وجود دارد وصل می کند.
شایدم باز هم متوجه نشده باشم.!

مرسی نکته مهمی رو گفتی من فکر نمیکردم که ترتیب مهم باشه -فقط راهی نداره که ترتیب مهم نباشه جون کاربر که نمودونه باید چطوری وارد کنه -ووقتی تعداد نقطه ها زیاد میشه دیگه تشخص اینکه ترتیب باید به چه شکلی باشه سخته

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 19:32 عصر
سلام دوستان.
من ازین کدهایی که شما نوشتین سردر نمیارم میشه برام توضیح بدین؟ممنون میشم.
من کدهاتون رو کپی کردم ولی g رو نمیشاسه باید چیکار کنم؟
با تشکر...





Graphics g;

الان کد من کار نمیکنه جون باید ارایه ساخته بشه مگه نقاط رو حودت دستی وارد کنی

morteza271
پنج شنبه 29 اردیبهشت 1390, 20:32 عصر
ممنونم ولی من کد زیر رو نوشتم ولی کار نمیکنه و این خطا رو میده:

Use of unassigned local variable 'g'

اینم کد :

private void Form1_Load(object sender, EventArgs e)
{
Graphics g;
Point[] p = new Point[] { new Point(50, 10), new Point(20, 50), new Point(80, 50) };
Brush b = Brushes.Brown;
g.FillClosedCurve(b, p);
}
با تشکر.

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 21:03 عصر
ممنونم ولی من کد زیر رو نوشتم ولی کار نمیکنه و این خطا رو میده:

Use of unassigned local variable 'g'

اینم کد :

private void Form1_Load(object sender, EventArgs e)
{
Graphics g;
Point[] p = new Point[] { new Point(50, 10), new Point(20, 50), new Point(80, 50) };
Brush b = Brushes.Brown;
g.FillClosedCurve(b, p);
}
با تشکر.

Graphics g; بصورتpublic تغریف کن

morteza271
پنج شنبه 29 اردیبهشت 1390, 21:29 عصر
ممنونم ولی حالا این خطا رو میده:

Object reference not set to an instance of an object.
ممنون میشم کدتون رو بذارید تا بتونم بیشتر متوجه بشم.
مرسی

NIMA_1981
پنج شنبه 29 اردیبهشت 1390, 23:41 عصر
دوست عزیز شما باید مفاهیم اولیه gdi رو بدونید لطفا لینک زیر رو مطالعه کنید
http://www.c-sharpcorner.com/UploadFile/mahesh/gdi_plus12092005070041AM/gdi_plus.aspx

لطفا در مورد مشکلی که در تاپیک مطرح شده بحث کنید

با تشکر