PDA

View Full Version : چطور میشه آخرین نقطه ترسیم شده از خط رو بدست آورد؟



mbshareat
چهارشنبه 07 اسفند 1387, 18:42 عصر
اگه دقت کرده باشین تقریبا تمام متدهایی که در TCanvas به بیش از یک نقطه نیاز دارند مثل Rectangle - Ellipse -LineTo و حتی نوع TRect نقطه دوم را دقیق اعمال نمی کنند مثلا LineTo نقطه آخر رو ترسیم نمی کنه(حالا فرض کنید می خواهیم یک مستطیل و بعد یک خط بکشیم نقطه آخر مستطیل رو به عنوان نقطه اول خط می دهیم ولی توی بوم می بینیم مستطیل کوچکتر رسم شده و خط دم بریده است)و Rectangle همیشه مستطیلی کوچکتر از آنجه توقع می ره ترسیم می کنه .:اشتباه:
من مشغول نوشتن یه برنامه گرافیکی هستم که می خوام به کاربر اجازه بدم بعد از ترسیم بتونه نقاط اول و آخر خط و مربع و منحنی رو با اشاره گر بکشه و تغییر مکان بده.برای این کار X و Y نقاط رو توی آرایه می ریزم و اگه اشاره گر نزدیک نقطه ای رفت به کار بر اجازه می دم مختصات نقطه رو عوض کنه.:بامزه:
ولی اگه نقطه آخر همونی نباشه که توی TImage مثلا دیده میشه داستان مشکل میشه.اول به فکرم رسید که شاید در ترسیم نقطه آخر ترسیمی برابر نقطه آخر داده شده به متد منهای Sign فاصله نقطه دوم از نقطه اول باشه بعد امتحان کردم دیدم همیشه هم اینطور نیست.:گیج:
در مورد خط میشه نقطه آخر رو با Pixels ترسیم کرد ولی برای چهارگوش و دایره وضع فرق میکنه و باید بدونم نقطه دوم عملا کجاست.:متعجب:
اگه ممکنه یکی به من بگه برای چهارگوش و دایره چطور گوشه دوم واقعی رو پیدا کنم؟:لبخندساده:

Zahed2008
پنج شنبه 08 اسفند 1387, 14:10 عصر
سلام، به نظر من با تشکیل یه نامعادله می تونی بطور تقریبی نقطه کلیک شده توسط کاربر رو متوجه بشی. مثلاً
if (x2-1<x<x2+1) and (y2-1<y<y2+1) then ...
لازم به تذکر نیست که شرط مذکور رو در روال MouseDown می نویسی و نقطه (x2,y2) نقطه مورد نظر در صفحه تصویرت هست( مثلاً نقطه دوم مربع).
برای دایره هم شرط زیر رو در نظر می گیری:


error = sqr(x-x0) + sqr(y-y0) - sqr(R)
if abs(error) < 1 then ...
که (x0,y0) نقطه مرکزی دایره و R شعاع دایره هست. (یعنی y0=(y1+y2)/2، x0=(x1+x2)/2 )
و نقاط (x2,y2) , (x1,y1) به ترتیب نقاط ابتدا و انتهای دایره در ترسیم دلفی هستند. شعاع R رو هم فکر می کنم بلدی بدست بیاری (:R = sqrt( sqr(x1-x0) + sqr(y1-y0) ) B
امیدوارم توضیحاتم کافی بوده باشه. موفق باشید.

mbshareat
جمعه 09 اسفند 1387, 19:22 عصر
آقای Zahed2008 (http://barnamenevis.org/forum/member.php?u=79221) عزیز. از راهنماییتون ممنونم.
من هم می تونستم وقتی اشاره گر تقریبا نزدیک نقطه ترسیم شده رفت نقطه دوم را پیدا کنم .
راستش فکر کنم سوالم ناقص بود .من می خوام توی آرایه نقطه آخر از خط رو که واقعا ترسیم شده بریزم که کاربر که می خواد یک لنگر رو که هم نقطه دوم خطی است و هم نقطه دوم خط دوم با هم تغییر مکان بده نه هر نقطه که تقریبا نزدیک مکان اشاره گر باشه رو.:متفکر:
در ضمن اگه با استفاده از ()Sin و ()Cos شعاعهای یک دایره را ترسیم کنیم می بینیم که محل آخرین نقطه هر سی درجه ممکنه تغییر کنه و قاعده تقریبی داره.که البته در مورد مستطیل فرق داره!
در ضمن اینو هم می دونم که ترسیم خط توسط ویندوز به روش ضرب و سرریز باقیمونده است.
(پس چی رو نمی دونم؟):گیج:
من دارم یه برنامه می نویسم که توی اون می شه ترسیم برداری داشت ولی انتهای خط همون جایی نیست که اشاره گر ماوس هست ونیز بقیه اشکال برداری.
من خودم ترسیم خط رو به شیوه تقسیم اعشاری شبیه سازی کرده ام. که نقطه آخر رو هم ترسیم می کنه و ...
برنامم رو براتون می ذارم.در کنارش SharedUnit.pas رو هم گذاشتم که کارهای گرافیکی رو کمی آسون کرده و می تونین توی برنامه هاتون استفاده کنین.مثلا یه Procedure داره که با دریافت رشته همه جور چیزی ترسیم می کنه و خط دقیق ترسیم می کنه و تخم مرغ می کشه و... :لبخند:
اگه خواستین یه نگاهی بهش بندازین!:تشویق:

Zahed2008
سه شنبه 13 اسفند 1387, 08:11 صبح
سلام، فایلی که گذاشتید رو نمی تونم دانلود کنم!؟