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

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

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

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

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

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

Можно по Брезенхаму, можно есть еще алгоритм Цаолинь-Ву, он более эффективен
...
Рейтинг: 0 / 0
15.12.2003, 04:09
    #32352190
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто рисовал линии программно???? Нужен хелп
мдя.... деградируем однако-с... функция вида kx+b проходится еще в школе... равно как и поиск прямой проходящей через две точки....
...
Рейтинг: 0 / 0
15.12.2003, 08:10
    #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
15.12.2003, 08:26
    #32352239
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто рисовал линии программно???? Нужен хелп
М. Абраш :-)

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

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

x^2+y^2=R^2

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

а вообще говоря, вполне возможно, если юзать в полной мере графический процессор :))
...
Рейтинг: 0 / 0
15.12.2003, 09:58
    #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
15.12.2003, 10:08
    #32352309
StarWind
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто рисовал линии программно???? Нужен хелп
не, ну в асме разбираться, это как-то грустно, а если обрисовать алгоритм?
ведь это интересно... Обрисовать окружность быстро... используя например только целочисленную арифметику... мне было бы интересно...

Народ, паралельно вопросик... рисуем мы например линию под углом и получаем разумеется ступеньки. Существуют методы сглаживания этих ступенек, никто не знает что можно почитать по этому поводу? А то я в нете как-то нарыл, но там ближе к курсу математики... и слишком уж умными словами... а если попроще?
...
Рейтинг: 0 / 0
15.12.2003, 10:19
    #32352319
Skleroz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто рисовал линии программно???? Нужен хелп
alex_k: Уел, извращенец :) Но ИМХО линия побыстрее рисоваться будет, если ее тоже в асме отрисовывать.
StarWind: По поводу окружности - можно обойтись только целочисленной арифметикой, нужна только процедура извлечения квадратного корня, ессно, тоже целочисленная. Я на спектруме из какого-то целочисленного компилятора выдирал :)
Мля, тавтология какая-то получилась...
По поводу сглаживания - у знакомого книжка была. Не забуду - спрошу название (см. мой ник).
...
Рейтинг: 0 / 0
15.12.2003, 10:27
    #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
15.12.2003, 10:31
    #32352333
alex_k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
кто рисовал линии программно???? Нужен хелп
корень, это круто. особенно на спектруме.
но без корня мне больше нравится, прощще.

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


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