powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / кто рисовал линии программно???? Нужен хелп
25 сообщений из 28, страница 1 из 2
кто рисовал линии программно???? Нужен хелп
    #32351063
*E*G*O*R*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди столкнулся с проблемой.
Мне нужно нарисовать линию координаты точек задаются
к примеру

x1:= 10 and y1:= 10
x2:= 100 and y2:= 55;

А алгоритм построения отрезка я никак придумать не могу.
Может ктонить это уже делал, или подкинет мысль как это сделать
А лучше код
:-))
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351073
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты на чем рисовать собрался?

[You Control].Canvas.MoveTo(x1, y1)
[You Control].Canvas.LineTo(x2, y2)
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351075
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
        MoveTo(X1,Y1);
        LineTo(X2,Y2);

Такую сложность с цветами мудрил, а с линией никак?
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351082
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие цвета????

А это что, не линия ?!
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351090
*E*G*O*R*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не рисовать нужно попиксельно
разные лаинТу не катят
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351092
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не тебе , Лелик, я Егору\r
Тут было
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351096
nomorenames
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И нафига, если не секрет, попиксельно?
В противном случае надо писать формулу прямой (Y=N*X), и для каждого Х ставить точку в соответствующий Y.
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351102
Rostyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32351414
Фотография Lelikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так бы и написал, что попиксельно

Можно по Брезенхаму, можно есть еще алгоритм Цаолинь-Ву, он более эффективен
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352190
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мдя.... деградируем однако-с... функция вида kx+b проходится еще в школе... равно как и поиск прямой проходящей через две точки....
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352232
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ы-ы-ы-ы-ы... (Эт я так гогочу)... Какие формулы??
Со спектрума еще помню:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
dx:=x2-x1;
dy:=y2-y1;
if mod(dx)>mod(dy) then begin
  sx:=sign(dx);
  sy:=dy/mod(dx);
  max:=mod(dx);
end else begin
  sy:=sign(dy);
  sx:=dx/mod(dy);
  max:=mod(dy);
end;

x:=x1;y:=y1;
for i:= 1  to max do begin
  //в этой строчке аналог Pixels[round(x), round(y)]=...
  //к примеру, через ScanLine(..)
  x:=x+sx; y:=y+sy;
end;

Код проверить не могу - винду переставил, а Delphi нет :)
К тому же, уже все позабыл - мне 1С-иной на работе мозги хорошо пропарили. Даж не помню - есть такая функция Sign или нет, так что за ошибки не бейте ;)

Вот вам задачка: нарисуйте кружочек без использования всяких там синусов... Попиксельно... :)
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352239
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М. Абраш :-)

приблизительная цитата:
"если оптимизировать алгоритм такими темпами дальше, то в конце концов функция рисования линии будет состоять из одной команды nop" :-)

когда я плотно этим занимался, один цикл рисования окружности занимал у меня меньше тактов чем один цикл рисования линии. на 286 процессоре.
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352243
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алекс_Ка: x=x+dx! Куда проще-то? Если вспомнить спектрум, то там горизонтально можно было еще до восьми пикселей вывести ;)
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352248
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так на vga то же самое.
там четыре слоя на одном адресном пространстве. один байт представляет 8 пикселей. из четырех битов четырех байтов разных слоев организуется цветовой индекс. в этом смысле отличия небольшие.
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352256
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладненько, это извращение применимо к линиям, которые хоть как-то похожи на горизонтальные :D. А с окружностью как?
Давай, вспоминай, что ты за принцип использовал при прорисовке окружности. Интересно же!
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352268
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тут только так, мельком уравнение брошу. Рисованием окружности не занимался :))

x^2+y^2=R^2

я думаю символ ^2 все расшифруют как "квадрат"?
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352284
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это понятно, так и делал, меня больше интересует выражение
Alex_kкогда я плотно этим занимался, один цикл рисования окружности занимал у меня меньше тактов чем один цикл рисования линии. на 286 процессоре
Это как? Там, видать, формула покруче, нежели у тебя, StarWind :)
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352292
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нее, у него карточка просто заточена была на это (шутка)

а вообще говоря, вполне возможно, если юзать в полной мере графический процессор :))
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352299
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я щас точно не помню, вот моя процедура, которой я на паскале пользовался.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
	  procedure circle(x,y:word;r,c:byte);
	  var	aaa,stk,esx,sgm,bp1:word;
	  label	tml,l2,l3,en;
	  begin
          point_x:=x;
          point_y:=y;
		asm;
		    mov	ch,r
		    mov	cl,c
		    mov	di,x
		    mov	bx,y
		    pusha
		    push es
		    mov	bh,cl
		    mov	bp1, 5 
		    mov	dx,cx
		    mov	dl, 0 
	mov ax, 0 
	mov sgm,ax
	mov stk,ax
	mov si,videosegment
	mov es,si
	mov ah,bl
	mov si,ax
	shr ax, 2 
	add si,ax
	add si,di
	mov esx,si
	mov al, 0 
	mov ah,dh
	mov di,ax
	shr ax, 2 
	add di,ax
	jmp l2
tml:	mov al,dh
	mov ah, 0 
	shl ax, 1 
	add bp1,ax
	dec bp1
l2:	mov si,esx
	mov cx,stk
	mov ah, 0 
	mov al,dh
	add si,ax
	add si,cx
	mov es:[si],bh
	shl ax, 1 
	shl cx, 1 
	sub si,ax
	mov es:[si],bh
	sub si,cx
	mov es:[si],bh
	add si,ax
	mov es:[si],bh
	mov si,esx
	mov cx,di
	mov ah, 0 
	mov al,dl
	add si,ax
	add si,cx
	mov es:[si],bh
	shl ax, 1 
	shl cx, 1 
	sub si,cx
	mov es:[si],bh
	sub si,ax
	mov es:[si],bh
	add si,cx
	mov es:[si],bh
	inc dl
	add stk, 320 
	mov al,dl
	mov ah, 0 
	shl ax, 1 
	inc ax
	mov si,ax
	mov ax,sgm
	add ax,si
	mov sgm,ax
	cmp ax,bp1
	jnc l3
	jmp l2
l3:	dec dh
	sub di, 320 
	cmp dh,dl
	jc en
	jmp tml
en:	pop es
	popa
	end;
end;
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352309
StarWind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не, ну в асме разбираться, это как-то грустно, а если обрисовать алгоритм?
ведь это интересно... Обрисовать окружность быстро... используя например только целочисленную арифметику... мне было бы интересно...

Народ, паралельно вопросик... рисуем мы например линию под углом и получаем разумеется ступеньки. Существуют методы сглаживания этих ступенек, никто не знает что можно почитать по этому поводу? А то я в нете как-то нарыл, но там ближе к курсу математики... и слишком уж умными словами... а если попроще?
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352319
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k: Уел, извращенец :) Но ИМХО линия побыстрее рисоваться будет, если ее тоже в асме отрисовывать.
StarWind: По поводу окружности - можно обойтись только целочисленной арифметикой, нужна только процедура извлечения квадратного корня, ессно, тоже целочисленная. Я на спектруме из какого-то целочисленного компилятора выдирал :)
Мля, тавтология какая-то получилась...
По поводу сглаживания - у знакомого книжка была. Не забуду - спрошу название (см. мой ник).
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352329
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в кратце так:
окружность делится на 8 симметричных частей. рассчитываем только одну осьмушку и ставим 8 пикселей.

осьмушка рассчитывается начиная с крайней правой позиции. там квадрат радиуса КР равен квадрату икса КХ.

затем, при уменьшении квадрата игрека КУ, квадрат икса КХ изменяется так, чтобы сохранилось равентсво КР=КУ+КХ. если при этом у=у+1 то КУ=(у+1)*(у+1)
КУ=у*у+2у+1
у*у это КУ значит
КУ=КУ+2у+1

если при этом сумма КУ и КХ станет больше КР, значит пора перейти влево по иксу, и уменьшить КХ тем же методом.
КХ=(х-1)*(х-1)
КХ=КХ-2х+1


в общем алгоритм получается такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
КР=р*р
КХ=р*р
КУ= 0 


пока (КУ<КХ)
КУ=КУ+у+у+ 1 
у++
если (КУ+КХ>КР) тогда
 КХ=КХ-х-х+ 1 
 х --
 
конецесли
пиксел(х_+х,у_+у)
пиксел(х_+х,у_-у)
пиксел(х_-х,у_+у)
пиксел(х_-х,у_-у)

пиксел(х_+у,у_+х)
пиксел(х_+у,у_-х)
пиксел(х_-у,у_+х)
пиксел(х_-у,у_-х)
конецпока


примерно так
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352333
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
корень, это круто. особенно на спектруме.
но без корня мне больше нравится, прощще.

а сглаживание линии привязывается к дополнительным переменным. в алгоритме бризинхема есть переменаня, которая хранит ихменяющееся соотношение х/у. вот с учетом всех частных случаев(горизонтальные и вертикальные) рисуется линия в три пиксела. основной в полный цвет и по бокам, у которых интенсивность рассчитывается в зависимости от того насколько пиксел отклонен от идеальной линии.
получается гораздо геморнее чем просто линия, но почти не медленнее и картинка нормально выглядит.
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352335
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
затем, при уменьшении квадрата игрека КУ
следует читать - "при увеличении"
...
Рейтинг: 0 / 0
кто рисовал линии программно???? Нужен хелп
    #32352341
Фотография Skleroz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k: Красиво! Куда-уж с моим корнем... Молодец!
...
Рейтинг: 0 / 0
25 сообщений из 28, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / кто рисовал линии программно???? Нужен хелп
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]