Хочу нарисовать параболу, но вот незадача, не знаю как. Вывести точки не проблема, а как их потом соединить, чтобы получилась эта самая парабола? Знаний не хватает, последний раз занимался ассемблером еще во времена Спектрума. Если можно, то хотя бы скелет кода. Просмотрел соседнюю тему с предупреждением для студентов. Эта не студенческая задача и я давно уже вышел из того возраста, когда учатся в институте.
Алгоритм "ЦДА" позволит подобрать такой шаг по одной из осей дабы не делать лишних вычислений и все точки были слитными.
Цифровой дифференциальный алгоритм, для линий придумался но его можно приспособить для любой функции. Могу выслать методу по графике, где то должна быть
Ну вообще не обязательно как-то по особому выбирать шаг. Главное уметь строить кривулины в граф режиме
По абсциссе можно взять шаг, равный одной точке, рассчитав коэф. масштабирования, а по ординате достраивать от каждой точки вертикальные отрезки до середины расстояния до соседней и предыдущей точек. Это несколько напоминает алгоритм Брезенхема.
Вот как раз, как строить отрезки я и не знаю. Выводить же попиксельно - неправильно, как мне кажется.
Vov4ick Нннууу... Брезенхема напоминает с натяжкой... Ну да, будет набор разрозненных точек, а не кривая
dsoft Ну почему же неправильно? Если ты строишь параболу с шагом в один пиксель, то это будет проще написать и быстрее работать, чем алгоритм Брезенхэма. Если же хочется реализовать именно Брезенхэма - то см., например, здесь: http://alglib.sources.ru/graphics/.
Код (Text): procedure line(x1,y1,x2,y2,color:word);far;assembler; asm cli mov ax, 0A000h mov es, ax mov ax, [bp+0Eh] mov bx, [bp+0Ch] mov cx, [bp+0Ah] mov dx, [bp+08h] sub cx, ax jns @L00F0 mov byte ptr cs:[@L013E], 4Eh mov byte ptr cs:[@L0168], 4Eh neg cx jmp @L00FC @L00F0: mov byte ptr cs:[@L013E], 46h mov byte ptr cs:[@L0168], 46h @L00FC: sub dx, bx jns @L0110 mov byte ptr cs:[@L0147+1], 0EEh mov byte ptr cs:[@L015C+1], 0EEh neg dx jmp @L011C @L0110: mov byte ptr cs:[@L0147+1], 0C6h mov byte ptr cs:[@L015C+1], 0C6h @L011C: xchg bl , bh mov si, bx shr bx, 2 add si, bx add si, ax inc cx inc dx xor ax, ax mov bl , [bp+06h] cmp cx, dx jb @L014F cli mov di, cx @L0136: mov es:[si], bl @L013E: inc si add ax, dx cmp ax, di jb @L014B sub ax, di @L0147: add si, 0140h @L014B: loop @L0136 jmp @L016B @L014F: cli xchg cx, dx mov di, cx @L0154: mov es:[si], bl @L015C: add si, 0140h add ax, dx cmp ax, di jb @L0169 sub ax, di @L0168: inc si @L0169: loop @L0154 @L016B: sti end; в детсве написал (лет эдак 15 назад), особо не пинать (!!!) переносил с Z80 потом на интел ещё гдето валялась рисование эллипсов - помню что расчитывалось по таблице дуга помоему в 45гр. остальные точки достраивались отражением ( работало быстро на Z80 на i так и не перенёс помоему )
вывод линии и у зубкова есть. кстати именно брезенхама. даже вроде рисование круга есть. при чем под 16бит вроде
Ну если по хорошему, то нужно строить в два этапа. 1. От 0 до X при котором производная дойдет до 1/2. Y=f(X) 2. Потом от последнего Y и выше до требуемого значения. Ну тут нужно расчитывать X=f(Y) Тогда не будет пропусков в графике и не нужно рассчитывать некоторые точки по два раза.