|
Основной форум Сюда все проблемы связанные с программированием. |
22.01.2010, 20:58
|
#16
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
Сообщение от VotapilD
O_O А не долговато ли? Толстую линию по Брезенхаму?
|
Да нет вроде. Ну можно по DDA, оно вообще летает
UPD: А не, DDA тот еще тормоз, ибо деление....
Последний раз редактировалось Tronix, 22.01.2010 в 22:28.
|
(Offline)
|
|
23.01.2010, 01:08
|
#17
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
Вообще не нужны никакие брезенхамы имхо. Толстая линия - это всего лишь много тонких линий и не более )) Вот прям щаз на коленке накатал. Если не задавать гигантскую ширину, вполне может прокатить ))) Писалось за 5 мин, поэтому если сильно накосячил прошу не пинать больно.
program NewProject2; // // Simle draw lines with width demo program. (c) Tronix, 2010. // Var gw,gh : integer; // screen width and height xx1,xx2, yy1,yy2 : integer; // random coordinates for line width : integer; // line width // Very simple procedure for drawing lines with any width // x1,y2,x2,y2 - screen coordinates // d - line width Procedure BigLine(x1,y1,x2,y2,d: integer); Var i, swap : integer; Begin If x1 = x2 then // vertical line Begin For i := d div 2 - d to d div 2 do DrawLine(x1+i,y1,x2+i,y2); End else If y1 = y2 then // horizontal line Begin For i := d div 2 - d to d div 2 do DrawLine(x1,y1+i,x2,y2+i); End else Begin DrawLine(x1,y1,x2,y2); // draw sinle line If d > 1 then // if width > 1 then draw left and right lines Begin If x1 > x2 then // sorting coordinates if needed Begin swap := x2; x2 := x1; x1 := swap; swap := y2; y2 := y1; y1 := swap; End; If (x1 < x2) and (y1 < y2) then // detect line direction Begin // left-to-right line For i := 1 to d div 2 do Begin DrawLine(x1,y1+i,x2-i,y2); //left side DrawLine(x1+i,y1,x2,y2-i); //right side End End else // righ-to-left line Begin For i := 1 to d div 2 do Begin DrawLine(x1+i,y1,x2,y2+i); // left side DrawLine(x1,y1-i,x2-i,y2); // right side End End; End; End; //if End; begin Randomize; gw := GetWidth; gh := GetHeight; SetColor(0,0,0); FillRect(0,0,gw,gh); // clear screen. black repeat xx1 := Random(gw); yy1 := Random(gh); // random line coordinates xx2 := Random(gw); yy2 := Random(gh); width := Random(10)+1; // line width >= 1 SetColor(Random(255),Random(255),Random(255)); // random color for line bigLine(xx1,yy1,xx2,yy2,width); // DRAW it Now :))) SetColor(255,255,255); // white color for debug msg DrawText('X1= '+xx1+' Y1= '+yy1,0,0); DrawText('X2= '+xx2+' Y2= '+yy2,0,10); DrawText('W= '+width,0,20); // draw debug information repaint; repeat delay (10) until getkeyclicked <> KE_NONE; // waiting for any key SetColor(0,0,0); // clear screen FillRect(0,0,gw,gh); repaint; until GetKeyPressed = KE_STAR; // exit if 'star' key will be pressed end.
Последний раз редактировалось Tronix, 23.01.2010 в 16:36.
|
(Offline)
|
|
23.01.2010, 01:54
|
#18
|
Модератор
Регистрация: 03.04.2007
Сообщений: 2,252
Написано 597 полезных сообщений (для 817 пользователей)
|
Ответ: Ошибка синтаксиса.
Нашел в нете упоминание о классе Graphics2D для java, там есть разные стили линий, и другие графические инструменты, попробую под него либу накатать (если NetBeans на семерку встанет).
|
(Offline)
|
|
23.01.2010, 12:27
|
#19
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
А вообще погорячился я. Интересная задачка на самом деле... После некоторых раздумий пришел к банальному - рисуем основную линию по Брезенхему, причем из каждой нарисовоной точки рисуем еще одну линиию перпендикулярно нашей основной линии.
Ну либо тупо рисовать закрашенный полигон, но это уже деление-умножение, причем подозреваю вешественное. Хотя не известно что еще быстрее будет...
UPD: ыыыыы, оказывается изобрел велосипед - http://homepages.enterprise.net/murp...ine/index.html
Последний раз редактировалось Tronix, 23.01.2010 в 14:10.
|
(Offline)
|
|
23.01.2010, 14:19
|
#20
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Ошибка синтаксиса.
А что если и правда sin&cos? Седне в школе по памяти на алгебре(на контрольной=) ) накатал:
a:=abs(x1-x2);//катит у
b:=abs(y1-y2);//катит х
c:=sqrt(a*a+b*b);//гипотенуза
cos:=b/c;//cosB
sin:=a/c;//sinB угол против стороны У
for i:=-2 to 2 do begin
x1:=x1+cos*i;//
y1:=y1+sin*i;// Переносим точки, так
x2:=x2+cos*i;// чтобы линия была параллельна...
y2:=y2+sin*i;//
DrawLine(trunc(x1),trunc(y1),trunc(x2),trunc(y2));
end;
repaint;
Павел, я правильно вас понял?
Сообщение от Павел
А вообще у линии есть угол , вот собственно толстая линия - это несколько обычных линий под одним и тем же углом. Значит, к координате X надо прибавлять косинус угла, а к Y - синус. Учите тригонометрию
|
Проверте плиз. Я щас без телефона, а эмуль под линь я пока не нашёл... И если это правильно то останется лишь придумать способ увеличение длины отрезка по краям)
|
(Offline)
|
|
23.01.2010, 14:54
|
#21
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Ошибка синтаксиса.
Выбрался к винде.. Что-то не то....
program sincos;
var x1,x2,y1,y2,a,b,c,cos,sin:real;
i:integer;
begin
x1:=0;
y1:=0;
x2:=100;
y2:=100;
a:=abs(trunc(x1-x2));//катит у
b:=abs(trunc(y1-y2));//катит х
c:=sqrt(a*a+b*b);//гипотенуза
cos:=b/c;//cosB
sin:=a/c;//sinB угол против стороны У
for i:=-2 to 2 do begin
x1:=x1+cos*i;//
y1:=y1+sin*i;// Переносим точки, так
x2:=x2+cos*i;// чтобы линия была параллельна...
y2:=y2+sin*i;//
DrawLine(trunc(x1),trunc(y1),trunc(x2),trunc(y2));
end;
repaint;
delay(3000);
x1:=100;
y1:=100;
x2:=0;
y2:=100;
a:=abs(trunc(x1-x2));//катит у
b:=abs(trunc(y1-y2));//катит х
c:=sqrt(a*a+b*b);//гипотенуза
cos:=b/c;//cosB
sin:=a/c;//sinB угол против стороны У
for i:=-2 to 2 do begin
x1:=x1+cos*i;//
y1:=y1+sin*i;// Переносим точки, так
x2:=x2+cos*i;// чтобы линия была параллельна...
y2:=y2+sin*i;//
DrawLine(trunc(x1),trunc(y1),trunc(x2),trunc(y2));
end;
repaint;
delay(3000);
x1:=0;
y1:=100;
x2:=50;
y2:=50;
a:=abs(trunc(x1-x2));//катит у
b:=abs(trunc(y1-y2));//катит х
c:=sqrt(a*a+b*b);//гипотенуза
cos:=b/c;//cosB
sin:=a/c;//sinB угол против стороны У
for i:=-2 to 2 do begin
x1:=x1+cos*i;//
y1:=y1+sin*i;// Переносим точки, так
x2:=x2+cos*i;// чтобы линия была параллельна...
y2:=y2+sin*i;//
DrawLine(trunc(x1),trunc(y1),trunc(x2),trunc(y2));
end;
repaint;
delay(3000);
end;
Зато они параллельны! Это достижение)
|
(Offline)
|
|
23.01.2010, 16:51
|
#22
|
Бывалый
Регистрация: 18.08.2009
Сообщений: 745
Написано 146 полезных сообщений (для 215 пользователей)
|
Ответ: Ошибка синтаксиса.
VotapilD, nhal по wine работает.
в втк возможно эмуль входит, но яву я так и не смог поставить нормально(((
|
(Offline)
|
|
23.01.2010, 18:32
|
#23
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
Не-не, sin/cos это все тормоза адовые. Да к тому-же еще и float-point. Щаз может полигонами запилю, будет как настоящая
UPD: Кое чего получается.... Осталось только код в порядок привести, или фиг с ним? )
Последний раз редактировалось Tronix, 23.01.2010 в 19:52.
|
(Offline)
|
|
23.01.2010, 20:36
|
#24
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
Короче набросал вроде с помощью треугольников. Главный косяк - не помню вообще как найти точки ABCD (см рисунок). По обрывкам памяти и гуглу набросал, но чувствую что криво, што ппц.
Плюсы:
- быстро. В процедуре отрисовки треугольника только целочисленные числа. Единственное два деления на итерацию на inner_loop, но не критично.
- Когда вертикально или горизонтально - рисуем просто стандартным FillRect
- Когда ширина = 1 рисуем просто стандартно Line
Минусы:
- немного не точно, ибо либо с формулой точек ABCD косяк либо где-то чето не так округляется. Если не придираться - смотрица нормально.
- нельзя с помощью такого метода рисовать пунктирные линии например. Хотя с помощью небольшой допилки filltriangle можно. А если впилить простейшее текстурирование можно даже текстурами рисовать )))
Скриншоты всего этого безобразия выше.
|
(Offline)
|
|
23.01.2010, 20:42
|
#25
|
Задрот
Регистрация: 24.07.2009
Адрес: Ивановская область, г. Кинешма
Сообщений: 1,574
Написано 407 полезных сообщений (для 863 пользователей)
|
Ответ: Ошибка синтаксиса.
Мой мозг никак не уймется. Автор, какая связь между названием темы и ее содержанием?? Может я что то не понимаю...
|
(Offline)
|
|
23.01.2010, 22:53
|
#26
|
Мастер
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений (для 713 пользователей)
|
Ответ: Ошибка синтаксиса.
Что вы мучаетесь? Может мне легче библиотеку для рисования линии произвольной толщины написать? Будет работать немного быстрее и без глюков. Я вроде геометрию пока не всю забыл.
|
(Offline)
|
|
23.01.2010, 23:02
|
#27
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Ошибка синтаксиса.
Сообщение от Павел
Мой мозг никак не уймется. Автор, какая связь между названием темы и ее содержанием?? Может я что то не понимаю...
|
мне даже говорить стыдно...
Сообщение от Tronix
Короче набросал вроде с помощью треугольников. Главный косяк - не помню вообще как найти точки ABCD
|
Спасибо за идею, буду пробовать... Код какой-то странный, щас вот эмуль поставлю)
|
(Offline)
|
|
23.01.2010, 23:03
|
#28
|
Оператор ЭВМ
Регистрация: 07.12.2009
Адрес: Мытищи
Сообщений: 44
Написано 6 полезных сообщений (для 6 пользователей)
|
Ответ: Ошибка синтаксиса.
Сообщение от odd
Что вы мучаетесь? Может мне легче библиотеку для рисования линии произвольной толщины написать? Будет работать немного быстрее и без глюков. Я вроде геометрию пока не всю забыл.
|
Давай)Я те вроде в ЛС писал))) Буду очень благодарен) И если можно, для вектора тоже)
|
(Offline)
|
|
23.01.2010, 23:16
|
#29
|
Знающий
Регистрация: 26.07.2009
Адрес: Россия, Москва
Сообщений: 318
Написано 103 полезных сообщений (для 331 пользователей)
|
Ответ: Ошибка синтаксиса.
Сообщение от odd
Что вы мучаетесь? Может мне легче библиотеку для рисования линии произвольной толщины написать? Будет работать немного быстрее и без глюков. Я вроде геометрию пока не всю забыл.
|
Да я собственно не мучаюсь, так просто время свободное было вот и предложил уже 2 варианта решения. Если первый смотрится конечно не очень (хотя мне нравятся острые концы у линии), то последний вполне себе кошерно выглядит на мой взгляд. Прям как во всяких модулях Graph турбопаскальных Кстати о каких именно глюках речь? В последнем варианте я их лично не наблюдаю.
Но если есть какие-то стандартные средства в яве, чтобы пилить толстые линии - то конечно проще сделать либу, чем так извращатся. Вообще будет полезная штука я думаю, особенно если с паттернами (прерывистая там, пунктирная и тд)
|
(Offline)
|
|
24.01.2010, 10:59
|
#30
|
Разработчик
Регистрация: 16.08.2008
Адрес: Нижегородская провинция
Сообщений: 389
Написано 48 полезных сообщений (для 93 пользователей)
|
Ответ: Ошибка синтаксиса.
Сообщение от odd
Что вы мучаетесь? Может мне легче библиотеку для рисования линии произвольной толщины написать? Будет работать немного быстрее и без глюков. Я вроде геометрию пока не всю забыл.
|
Еще бы и XML довел до ума, а то одни обрывки слов.
__________________
- Это мы накодили WINDOWS,
- Это мы надкусили APPLE,
- Нам играют живые The Beatles
- И нестареющий Вова Высоцкий...
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 15:30.
|