ورود

View Full Version : رسم پیوسته خط



Beginner2013
سه شنبه 20 تیر 1391, 20:17 عصر
سلام،


procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if not MouseIsDown then
exit;
Form1.Canvas.Pixels[x,y]:=clRed;
end;


من با کد فوق روی فرمم خط ترسیم میکنم اما وقتی موس با کمی سرعت کشیده میشه خط ناپیوسته و نقطه نقطه میشه.لطفا راهنمایی نمایید.
با تشکر

Felony
سه شنبه 20 تیر 1391, 20:33 عصر
یاد 6 سال پیش که تازه کار با دلفی رو شروع کرده بودم افتادم ، یادمه 1 ساعت با کدها کلنجار رفتم تا بتونم این مورد رو برای برنامه Paint خودم پیاده کنم ( اون موقع میونه خوبی با گوگل نداشتم ) :

Canvas.LineTo(X, Y);
Canvas.MoveTo(X, Y);

Beginner2013
چهارشنبه 21 تیر 1391, 08:21 صبح
یاد 6 سال پیش که تازه کار با دلفی رو شروع کرده بودم افتادم ، یادمه 1 ساعت با کدها کلنجار رفتم تا بتونم این مورد رو برای برنامه Paint خودم پیاده کنم ( اون موقع میونه خوبی با گوگل نداشتم ) :

Canvas.LineTo(X, Y);
Canvas.MoveTo(X, Y);

اینی که شما دادید مشکل مذکور رو نداره ولی با اولین کلیک یک خط از ابتدای صفحه تا جایی که کلیک شده رسم میکنه،و وقتیم که جاهای این دو تا متدی رو که دادید عوض میکنم این مشکل نیست ولی خط هام باز حالت ناپیوسته پیدا می کنن.لطفا راهنمایی کنید
با تشکر

Felony
چهارشنبه 21 تیر 1391, 08:34 صبح
خوب وقتی کلیک موس فشار داده شد ( رویداد OnMouseDown ) مکان Cursor رو به محل فعلی که کلیک کردید منتقل کن تا رسم از اونجا شروع بشه ، مکان Cursor به صورت پیش فرض 0,0 هست :

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
begin
IsMouseDown:= True;
Canvas.MoveTo(X, Y);
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsMouseDown then
begin
Canvas.LineTo(X, Y);
Canvas.MoveTo(X, Y);
end;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
IsMouseDown:= False;
end;

Ananas
چهارشنبه 21 تیر 1391, 20:43 عصر
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if IsMouseDown then
begin
Canvas.LineTo(X, Y);
Canvas.MoveTo(X, Y);
end;
end;



ممنون مجتبی جون. البته دستور MoveTo بعد از دستور LineTo لزومی نداره یعنی LineTo خودش این کارو میکنه و بعد از رسم خط مکان رو به نقطه جدید انتقال میده.
البته می تونید بدون استفاده از OnMouseDown و OnMouseUp و همچنین پارامتر MouseIsDown فقط تو رویداد OnMouseMove کد زیر رو بنویسید :

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if ssLeft in Shift then
Canvas.LineTo(X, Y)
else
Canvas.MoveTo(X, Y);
end;

mbshareat
چهارشنبه 21 تیر 1391, 21:45 عصر
سلام و درود
اگه این کد رو هم اضافه کنین دیگه چیزی لازم نیست:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
Canvas.MoveTo(X, Y);
end;
من خیلی با این کارها وقتمو تلف کردم(ترسیم خط و غیره با ماوس).به نظرم جز یادگیری برنامه نویسی دلیلی نداره آدم ترسیم برداری رو خودش انجام بده.
وقتی فلش هست چرا چیز ساده طراحی کنیم؟ چنین کدی (استفاده از متغیر بولی) توی طراحی کامپوننت کاربرد داره.

Ananas
چهارشنبه 21 تیر 1391, 22:31 عصر
من خیلی با این کارها وقتمو تلف کردم(ترسیم خط و غیره با ماوس).به نظرم جز یادگیری برنامه نویسی دلیلی نداره آدم ترسیم برداری رو خودش انجام بده.
وقتی فلش هست چرا چیز ساده طراحی کنیم؟ چنین کدی (استفاده از متغیر بولی) توی طراحی کامپوننت کاربرد داره.
وقت تلف نکردی، تجربه کسب کردی. اینا یجور تمرینه برای تسلط به ابزارهایی که در اختیار داریم. من با Direct3D هم که کار میکنم نیاز دارم که کاربر با حرکت دادن موس و فشردن دکمه هاش بتونه با برنامه و از دید دوربین سه بعدی ارتباط برقرار کنه. مثلا برای ترسیم یک باکس در صحنه ی سه بعدی و یا Move کردن اشیا و یا شلیک در بازی میشه از همین توابع موس استفاده کرد. و مثلا نوشتن نرم افزارهایی که Paint3D دارند و از دید دوربین سه بعدی روی اشیای سه بعدی نقاشی میکشن نیازمند داشتن درک خوب از روش کار با موس هست که با همین تمرین میشه فهمید هنگام کلیک و درگ کردن روی فرم چه اتفاقی داره از دید برنامه نویسی می افته.

mbshareat
پنج شنبه 22 تیر 1391, 11:08 صبح
ممنونم. البته هر کاری تو محیط برنامه نویسی بکنیم حد اقلش باعث میشه ترسمون بریزه اما بعضی کارها استفاده محدودی داره و امکانات آماده ای وجود داره و نیاز به کد نیست.
من هم خوندم که با 3D Studio Max میشه بازی ساخت ولی به نظرم برنامه نویسها معمولا سراغ گرافیک نمیرن. فوقش یه اسکین گیر میارن و ... .
در هر صورت حرفهاتون که از سطح درکم بالاتر بود من فوقش بتونم چندتا کره و کپسول و غیره تو محیط سه بعدی طراحی کنم!!!

MohsenB
پنج شنبه 22 تیر 1391, 15:39 عصر
سلام

ساده ترین کدی که می تونید قرار بدید شاید این باشه :

procedure TForm1.img1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
with (Sender as TImage) do begin
if Shift = [ssLeft] then
Canvas.LineTo(X, Y);
Canvas.MoveTo(X, Y);
end;
end;

و اگه یکم هم بخواین بهش آب و تاب بدید اینم میشه :

procedure TForm1.img1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Canvas.MoveTo(X, Y);
end;


procedure TForm1.img1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
(Sender as TImage).Canvas.LineTo(X, Y);
end;


موفق باشید

mbshareat
پنج شنبه 22 تیر 1391, 17:25 عصر
سلام جناب MohsenB
کد دوم کار کد اول رو نمی کنه. یعنی با حرکت ماوس ترسیمی انچام نمیشه. ظاهرا اونچیزی که خواسته شده شبیه سازی ابزار مداده نه خط!

MohsenB
پنج شنبه 22 تیر 1391, 17:56 عصر
سلام جناب MohsenB
کد دوم کار کد اول رو نمی کنه. یعنی با حرکت ماوس ترسیمی انچام نمیشه. ظاهرا اونچیزی که خواسته شده شبیه سازی ابزار مداده نه خط!

سلام

آره راست میگین تو یه فروم خارجی که همچین کارایی میخواستن چند وقت پیش اینا رو جواب داده بودم ، مستقیم کپیشون کردم اینجا . حالا بالاخره تغریبا دوتاش تو یه مبحثن .

همون طور که گفتن کد اول برای ترسیم با مداد آزاد و کد دوم برای ترسیم خط مستقیم میتونه استفاده بشه .


موفق و پیروز باشید

Ananas
پنج شنبه 22 تیر 1391, 21:59 عصر
محسن جون داداش خوب کد منم که همین بود االبته ساده تر.


من هم خوندم که با 3D Studio Max میشه بازی ساخت ولی به نظرم برنامه نویسها معمولا سراغ گرافیک نمیرن. فوقش یه اسکین گیر میارن و ... .
در هر صورت حرفهاتون که از سطح درکم بالاتر بود من فوقش بتونم چندتا کره و کپسول و غیره تو محیط سه بعدی طراحی کنم!!!

خواهش میکنم... البته منظورم برنامه نویس هایی بود که برنامه ای مثل Z-Brush و یا خود مکس میسازن بود که برای برنامشون نیاز به استفاده از حرکت موس و رویدادهاش دارن. ساده ترین مثال میتونه چرخش دوربین توسط موس تو بازی های جنگی باشه.

joooje
شنبه 24 تیر 1391, 11:33 صبح
با سلام به دوستان
چرا وقتی با این کد کار میکنید اگر فرم یک بار پایین ببریم تا دیده نشه(پایین تر از تسکبار) و بالا بیارم همش پاک میشه؟
آقای Mahan-1363 برای برنامه paint تتون كه گفتيد اين مشكل رو چطوری حل كرديد؟
ميشه راهنمایی كنيد
ممنون

Felony
شنبه 24 تیر 1391, 11:50 صبح
باید عملیات ترسیم رو روی یک شیئ TImage انجام بدید :

Image1.Canvas.LineTo(X, Y);