PDA

View Full Version : کشیدن خط



maryam206
پنج شنبه 09 بهمن 1382, 17:04 عصر
سلام
برنامه ای بنویسید که مختصات دو نقطه در صفحه را دریافت کند و با یک خط آن دو را به هم متصل نماید که البته باید در مد گرافیکی این کار را انجام دهیم.
راه حلی که به نظر من میاد اینه که با استفاده از مختصات دو نقطه شیب خط رو پیدا کنیم و معادله خط را ایجاد کنیم و سپس از x کمتر شروع کنیم و مقدار آن y متناظرش را با جایگزاری در معادله خط پیدا کنیم و سپس آن نقطه حاصله را روشن کنیم.
اگر به نظر شما راه بهتری می توانیم پیدا کنیم من را راهنمایی کنید.
با تشکر
مریم

Best Programmer
پنج شنبه 09 بهمن 1382, 18:41 عصر
ببخشید دوست عزیز اینجا کسی پروژه دانشجویی نمی نویسه و اگر هم گاهی چیزی میبینی بیشتر برای خودی نشمون دادن هست.
بهتر هست که از موتور جستجو گر اینترنت خودتون استفاده کنید و از کسی که این را در اینتر نت گذاشته متشکر باشید و چند دعا براش Send کنید :lol:

maryam206
جمعه 10 بهمن 1382, 10:24 صبح
جهت اطلاع خدمتتون عرض کنم که اینجا یک محیط تبادل نظر هستش و من هم آن مسائلی رو که می خوام مطرح می کنم حالا اگه کسی مایل بود راهنمایی کنه می تونه نظرشو بده و اجباری در جواب دادن نیست .
اگه دوست نداری جواب بدی می تونی جواب ندی نه این که عمل یکی دیگه رو زیر سوال ببری.
خوب اگه بلد نیستی جواب بدی چرا این جور جوابای نامربوط به مسئله می دی :wink:

Best Programmer
جمعه 10 بهمن 1382, 14:42 عصر
خوب اگه بلد نیستی جواب بدی چرا این جور جوابای نامربوط به مسئله می دی

همیشه ایطور میگند تا جواب بگیرند. :lol:
ولی بازم جواب من همونه.
Use www.Google.com

B-Vedadian
شنبه 11 بهمن 1382, 00:02 صبح
دوست عزیز آقای «بهترین برنامه نویس»،

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

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

http://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html

Inprise
شنبه 11 بهمن 1382, 00:06 صبح
اگر برنامه تان برای محیطهای قبل از ان تی است به مود 4 اچ و الا برای کیفیت بهتر به مود 12 اچ تغییر وضعیت دهید . از اینتراپتهای سری 10 اچ هم برای ترسیمات گرافیکی استفاده کنید . الگوریتم هم که دادند مناسبه . :)

موفق باشید

Best Programmer
شنبه 11 بهمن 1382, 07:18 صبح
دوست بسیار عزیز آقای B-Vedadian
من فقط میخواستم که ایشون کمی به جای کار راحت در اینترنت جستجو کنند تا کمی بیشتر با این مقوله ( نحوه انتخاب Key Words های اصلی ) آشنا بشوند .
البته از جواب شما هم خیلی خوشحال شدم چون جواب نیست و شخص باید روش کار کند . منم میخواستم خودش دنبال راه حل باشه به جای اینکه اول بیاد اینجا اعلام کند.
البته پیشنهاد میدهم کتاب Peter Norton را مطالعه کند. :wink:

Best Programmer
شنبه 11 بهمن 1382, 14:53 عصر
من یه راه پیشنهاد میدم. البته شاید به نظر مسخره بیاد ولی میتونه جواب بده.
به نظر من اگر بیای 2 نقطه داده شده را وسطش را بدست آوری و دوباره وسط این دو نقطه ( نقطه جدید و یکی از نقاط فبلی ) را بدست آوری و همین طور ادامه بدی....... میتونی خط ایجاد بکنی. با هر شیب

Developer Programmer
شنبه 11 بهمن 1382, 16:46 عصر
به نظر من اگر بیای 2 نقطه داده شده را وسطش را بدست آوری و دوباره وسط این دو نقطه ( نقطه جدید و یکی از نقاط فبلی ) را بدست آوری و همین طور ادامه بدی....... میتونی خط ایجاد بکنی. با هر شیب

مشکل اینجاست که اگر نقطه ای مثلا 1.5 آمد چطوری آن رو نشان بدی پیکسل بالایی یا پایینی!
الگوریتم برزنهام هم همینو میگه

HamidSh
دوشنبه 31 فروردین 1383, 21:25 عصر
والا من که از این لینکه چیزی سر در نیاوردم
اما یه راه حل برا خودم پیدا کردم و برنامشو نوشتم 8)
برنامهه یه نمه مشکل داره ولی در کل جواب میده


dseg segment para 'data'
firstX dw 100
firstY dw 100
lastX dw 101
lastY dw 200
Ystep dw 1
eachR dw ?
totR dw ?
color db 14

dseg ends
cseg segment para 'code'
main proc
assume cs:cseg,ds:dseg
mov ax,dseg
mov ds,ax

mov ah,00h
mov al,12h
int 10h

mov cx,11
lineloop:
push cx
call line
add firsty,10
add lastx,10
pop cx
loop lineloop

mov ah,4ch
int 21h

main endp
line proc
mov bx,lastX
mov ax,lastY

sub bx,firstX ;Row
sub ax,firstY ;Col
push ax
shl ax,1
jc stepsign
mov Ystep,1
jmp next
stepsign:
mov Ystep,-1
next:
pop ax
mov dx,0
idiv bx

mov eachR,dx
mov totR,dx

mov cx,firstX
mov dx,firstY
loop1:
push ax
cmp bx,totR
ja collop1
inc ax
sub totR,bx
collop1:
call putpixel
cmp ax,0
jna next1
add dx,Ystep
dec ax
jnz collop1
next1:
pop ax
push bx
mov bx,totR
add bx,eachR
mov totR,bx
pop bx
inc cx
cmp cx,lastX
jne loop1
ret
line endp
putpixel proc
push ax
push bx
mov ah,0ch
mov al,color
mov bh,0
int 10h
pop bx
pop ax
ret
putpixel endp
mydiv proc
idiv bx
push dx
sal dx,1
cmp bx,dx
jl y
jmp no
y:
inc ax
no:
pop dx
ret
mydiv endp
cseg ends
end main

B-Vedadian
چهارشنبه 02 اردیبهشت 1383, 12:05 عصر
سلام،

لینکی که داده بودم نمیدونم الآن چرا ناقص کار میکنه، اما این یکی رو جدیدا امتحان کردم
http://gamedev.cs.colorado.edu/tutorials/Bresenham.pdf

در ضمن کد برنامه به زبان C از همون مرجع رو اینجا مینویسم تبدیلش به اسمبلی واقعا ساده اس اما اگه احیانا مشکلی داشتید میتونم کمک کنم، این کد خوب کار میکنه! :قهقهه:


void brenenham1(int x1, int y1, int x2, int y2)
{
int slope;
int dx, dy, incE, incNE, d, x, y;
// Reverse lines where x1 > x2
if (x1 > x2)
{
bresenham1(x2, y2, x1, y1);
return;
}
dx = x2 - x1;
dy = y2 - y1;
// Adjust y-increment for negatively sloped lines
if (dy < 0)
{
slope = -1;
dy = -dy;
}
else
{
slope = 1;
}
// Bresenham constants
incE = 2 * dy;
incNE = 2 * dy - 2 * dx;
d = 2 * dy - dx;
y = y1;
// Blit
for (x = x1; x <= x2; x++)
{
putpixel(x, y);
if (d <= 0)
{
d += incE;
}
else
{
d += incNE;
y += slope;
}
}
}

HamidSh
جمعه 11 اردیبهشت 1383, 03:23 صبح
وقتی تبدیلش کنید همون برنامه بالایی میشه :D

HamidSh
جمعه 11 اردیبهشت 1383, 03:38 صبح
با عرض شرمندگی فانکشن شما خط 400 و 150 و 150 و 0 را یه کمکی اشتباه میکشه

امتحان کنید

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

seyedof
جمعه 08 خرداد 1383, 15:13 عصر
سلام
الگوریتم برای رسم خط زیاد هست البته مشهورترینش همون ‌Bresenham است که فقط با استفاده از جمع و تفرق خط رو میکشه. روشی که آقای BestProgrammer گفتند هم کار میکنه و اسمش فکر کنم روش Mid Point باشه. سریعترین روش رسم خط هم روش Run Slice است.

ممنون

Seidali
شنبه 19 فروردین 1385, 13:09 عصر
سلام
برنامه ای بنویسید که مختصات دو نقطه در صفحه را دریافت کند و با یک خط آن دو را به هم متصل نماید که البته باید در مد گرافیکی این کار را انجام دهیم.
راه حلی که به نظر من میاد اینه که با استفاده از مختصات دو نقطه شیب خط رو پیدا کنیم و معادله خط را ایجاد کنیم و سپس از x کمتر شروع کنیم و مقدار آن y متناظرش را با جایگزاری در معادله خط پیدا کنیم و سپس آن نقطه حاصله را روشن کنیم.
اگر به نظر شما راه بهتری می توانیم پیدا کنیم من را راهنمایی کنید.
با تشکر
مریم
شما می توانید از الگوریتم برسنهام یا DDA استفاده نمایید.توضیحات بیشتر را در کتاب گرافیک کامپیوتری تالیف محمد رضا حیدری نژاد دنبال کنید.

raha_hakhamanesh
دوشنبه 21 فروردین 1385, 20:07 عصر
با سلام
من هم در ابتدا گفته دوست عزیزمان افشین زوار رو تایید می کنم و می گم که راه حل همون الگوریتم برزنهام است که برای ثبت اون حدود 10 سال طول کشید ولی یک نکته رو توجه کنید و اون اینکه کار رو خیلی سخت نکنید اسمبلی و سرفصل درسی این درس چنین توقعی رو نداره ولی اونچه که به عنوان پاسخ می شه بهش توجه کرد اینه که مختصات رو دریافت کرده سپس به بررسی این مختصات بپردازید شیب خط رو به دست بیارین و سپس برای هر نقطه که غیر صحیح به دست اومد یک قرارداد با خودتون بزارین مثلا کف اون رو بگیرین این روش نه در حد برزنهام ولی خوب جواب می ده ، من هم اونو امتحان کردم . موفق باشید

dadashiman
شنبه 12 آبان 1386, 17:57 عصر
سلام
من نیاز به الگوریتم برزنهام داشتم که خوشبختانه حل شد
مرسی

dadashiman
شنبه 12 آبان 1386, 17:58 عصر
من رسم خط توسط دو نقطه در c++ رو دارم اگر خواستید که براتون بگذارم