forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Отрисовка толстых линий (http://forum.boolean.name/showthread.php?t=11746)

Tronix 24.01.2010 22:55

Ответ: Ошибка синтаксиса.
 
2odd: Кстати, погуглив понял, что из того самого 2DGraphics возможно установить только два типа линий: SOLID и DOTED. Как я понимаю, SOLID это толщина в 3 пикселя, причем скорее всего рисуют в самом классе по тому же Брезенхему, как plot(x-1,y); plot (x,y); plot(x+1,y) - особо не заморачиваясь. Могу ошибаться конечно, но что-то мне подсказывает....

Есть еще отдельные библиотеки(или как там в яве), писаные сторонними товарищами, но это примерно те-же костыли, как и у меня. Возможно чуть быстрее ибо нативно на яве. Но принцип такой-же.

Также начиная с MIDP2.0 есть вроде-как стандартная функция рисования закрашенных треугольников (UPD: ну да, например здесь уже пробегала в lib_gfx например). Можно мою процедуру fillrectangle заменить на нее, на MIDP2 будет наверно быстрее, с другой стороны на MIDP1 работать не будет вообще.

odd 25.01.2010 03:08

Ответ: Отрисовка толстых линий
 
MIDP 1.0 скоро уйдет в историю как и старые профили мидлетов (не даром я их назвал "Под старину"), так что не стоит особо бояться проблем с совместимостью.

VotapilD 25.01.2010 22:36

Ответ: Ошибка синтаксиса.
 
Вложений: 1
Вот вроде бы рабочий мой вариант:
Цитата:

Сообщение от VotapilD (Сообщение 134484)
Код:

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);


Скрещение моей формулы и Tronixa в чём ошипка... Не могу найти.
АПД:Нужна библиотека Lib_gfx; А вообще, вот Все библиотеки(Вообще все)!

odd 26.01.2010 04:50

Ответ: Отрисовка толстых линий
 
Как доведете до блеска алгоритм, я его тогда реализую на Java в виде отдельной библиотеки. Без проблем. Или добавлю функцию рисования толстых линий в Lib_gfx.

VotapilD 26.01.2010 08:23

Ответ: Отрисовка толстых линий
 
Вложений: 1
Сегодня... Где-то в 2 часа ночи я закончил алгоритм. Вроде всё верно, фуууф...
ОНО РАБОТАЕТ!

Цитата:

Сообщение от odd (Сообщение 134783)
Как доведете до блеска алгоритм, я его тогда реализую на Java в виде отдельной библиотеки. Без проблем. Или добавлю функцию рисования толстых линий в Lib_gfx.

Посмотри, ещё сильней сжать алгоритм можно?)

odd 26.01.2010 13:36

Ответ: Отрисовка толстых линий
 
Нет, нормально. Больше вряд ли сожмется. Можно конвертировать в либу.
Ждите обновления библиотеки LIb_gfx

VotapilD 26.01.2010 15:08

Ответ: Отрисовка толстых линий
 
Можно ещё сильнее!(наверное)! xa,ya,xb и тд не надо делать реалом(Ставим Инт)!
после нахождения син и кос:

a:=abs(trunc(x1-x2));//катит у
b:=abs(trunc(y1-y2));//катит х
c:=(sqrt(a*a+b*b));//гипотенуза
cos:=(b/c);//cosB
sin:=(a/c);//sinB угол против стороны У
if (x2-x1<0)xor(y1-y2<0) then cos:=-cos;
cosadd:=trunc(cos*h);
sinadd:=trunc(sin*h);

xa:=x1+cosadd;//
ya:=y1+sinadd;// Переносим точки, так
xb:=x2+cosadd;// чтобы линия была параллельна...
...
...
FillTriangle(xa,ya,xb,yb,xc,yc);
FillTriangle(xc,yc,xd,yd,xb,yb);
end;

Но там баги с округлением(((

im_zorg 27.01.2010 19:35

Ответ: Отрисовка толстых линий
 
odd сделал скачай последьнюю версию lib_gfx

odd 27.01.2010 22:12

Ответ: Отрисовка толстых линий
 
Цитата:

Сообщение от im_zorg (Сообщение 134948)
odd сделал скачай последьнюю версию lib_gfx

Я там ещё немного упростил алгоритм. Попробуете округление, вроде бы получилось неплохо.

Tronix 27.01.2010 22:39

Ответ: Отрисовка толстых линий
 
Цитата:

Сообщение от odd (Сообщение 134973)
Я там ещё немного упростил алгоритм. Попробуете округление, вроде бы получилось неплохо.

Оооо, посмотрел исходник - значит моя формула верна все-таки. А я думал кривая она... Кстати, думаю там нужно вызывать M.G.filltriangle, а не filltriangle - а то получается функция drawline вызывает функцию filltriangle, которая вызывает filltriangle...

romby 20.11.2011 23:08

Ответ: Отрисовка толстых линий
 
А есть готовое решение для рисования линий со сглаженными краями (antialiasing)?

ВиНТ 27.02.2012 18:13

Ответ: Отрисовка толстых линий
 
Цитата:

Сообщение от impersonalis (Сообщение 133797)
рисуйте окружности. Радиус R - толщина линии. Над расстояниям - надо подумать..

садомазохизм :stop:

Однако надо не линиями пользоваться, а векторами(вершинами).
Если есть угол, то нужно его найти функцией atan2(y,x)! Вроде в MidletPascal 3.3 есть такая возможность. Так, ну ещё надо сделать вид центрирования это четырёхугольника(из векторов) - надо половину необходимой ширины отделить на каждую вершину разрывая углы на -90 и 90... Сложно.


Часовой пояс GMT +4, время: 21:40.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot