![]() |
Отрисовка толстых линий
Как сделать толстую линию? Даже идей нет, как и наработок. И так же дела с векторами состоят(
|
Ответ: Ошибка синтаксиса.
А какя связь между названием темы и ее содержанием?
|
Ответ: Ошибка синтаксиса.
А вообще у линии есть угол , вот собственно толстая линия - это несколько обычных линий под одним и тем же углом. Значит, к координате X надо прибавлять косинус угла, а к Y - синус. Учите тригонометрию :)
|
Ответ: Ошибка синтаксиса.
А как угол найти? ))
|
Ответ: Ошибка синтаксиса.
Ну ты же паскаль юзаешь, ты и должет знать. В Блице есть команда Atan2, собственно она то и возвращала угол...
|
Ответ: Ошибка синтаксиса.
И какая же в Паскале? Мой гугль не помогает) И хелп по МП тож
|
Ответ: Ошибка синтаксиса.
В MP не все так просто, надо свой алгоритм выдумывать.
Сейчас с наскока сообразить не могу, может потом поковыряюсь |
Ответ: Ошибка синтаксиса.
Ну можно логически подумать.... Есть две точки на плоскости, соответственно они представляют из себя прямоугольный треугольник. Ну вот значит надо вычислить этот угол, зная его синус(или косинус) . А найти этот самый синус можно, разделив длину противолежащего катета к гипотенузе. Косинус - эт вроде прилежащего к гипотенузе. тангенс - прилежащего к противолежащему...Ну в общем зная синус и косинус угла наверно сожно найти и угол :)
|
Ответ: Ошибка синтаксиса.
я када граф часы делал, рисовал часовую стрелку как-то так:
drawline(x,y,w,h); drawline(x+1,y,w,h); drawline(x,y+1,w,h); примерно ровно, если хочешь узнать точнее копай исходник в конце темы с noxOS |
Ответ: Ошибка синтаксиса.
Ваще ничо не понял. Толстая линия == несколько тонких линий. В чем проблема?
|
Ответ: Ошибка синтаксиса.
Цитата:
|
Ответ: Ошибка синтаксиса.
рисуйте окружности. Радиус R - толщина линии. Над расстояниям - надо подумать..
|
Ответ: Ошибка синтаксиса.
Вложений: 1
Ну не знаю. Если MP не позволяет под углом линии рисовать - то классически по Брезенхаму. Всю жизнь так рисовал. Даже интро запиливал неплохие.
|
Ответ: Ошибка синтаксиса.
Цитата:
Цитата:
Павел, угол можно найти зная синус ИЛИ косинус, вроде=) А их найти по отношению проекций... Но получится ли.. Или зачем нам теперь вообще угол? Цитата:
Цитата:
{130 просотров за 2 дня О_О}//offtop |
Ответ: Ошибка синтаксиса.
Цитата:
|
Ответ: Ошибка синтаксиса.
Цитата:
UPD: А не, DDA тот еще тормоз, ибо деление.... |
Ответ: Ошибка синтаксиса.
Вложений: 1
Вообще не нужны никакие брезенхамы имхо. Толстая линия - это всего лишь много тонких линий и не более )) Вот прям щаз на коленке накатал. Если не задавать гигантскую ширину, вполне может прокатить ))) Писалось за 5 мин, поэтому если сильно накосячил прошу не пинать больно.
PHP код:
|
Ответ: Ошибка синтаксиса.
Нашел в нете упоминание о классе Graphics2D для java, там есть разные стили линий, и другие графические инструменты, попробую под него либу накатать (если NetBeans на семерку встанет).
|
Ответ: Ошибка синтаксиса.
Вложений: 1
А вообще погорячился я. Интересная задачка на самом деле... После некоторых раздумий пришел к банальному - рисуем основную линию по Брезенхему, причем из каждой нарисовоной точки рисуем еще одну линиию перпендикулярно нашей основной линии.
Ну либо тупо рисовать закрашенный полигон, но это уже деление-умножение, причем подозреваю вешественное. Хотя не известно что еще быстрее будет... UPD: ыыыыы, оказывается изобрел велосипед - http://homepages.enterprise.net/murp...ine/index.html :) |
Ответ: Ошибка синтаксиса.
А что если и правда 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; Павел, я правильно вас понял? Цитата:
|
Ответ: Ошибка синтаксиса.
Выбрался к винде.. Что-то не то....
Код:
program sincos; Зато они параллельны! Это достижение) |
Ответ: Ошибка синтаксиса.
VotapilD, nhal по wine работает.
в втк возможно эмуль входит, но яву я так и не смог поставить нормально((( |
Ответ: Ошибка синтаксиса.
Вложений: 2
Не-не, sin/cos это все тормоза адовые. Да к тому-же еще и float-point. Щаз может полигонами запилю, будет как настоящая :)
UPD: Кое чего получается.... Осталось только код в порядок привести, или фиг с ним? ) |
Ответ: Ошибка синтаксиса.
Вложений: 2
Короче набросал вроде с помощью треугольников. Главный косяк - не помню вообще как найти точки ABCD (см рисунок). По обрывкам памяти и гуглу набросал, но чувствую что криво, што ппц.
Плюсы: - быстро. В процедуре отрисовки треугольника только целочисленные числа. Единственное два деления на итерацию на inner_loop, но не критично. - Когда вертикально или горизонтально - рисуем просто стандартным FillRect - Когда ширина = 1 рисуем просто стандартно Line Минусы: - немного не точно, ибо либо с формулой точек ABCD косяк либо где-то чето не так округляется. Если не придираться - смотрица нормально. - нельзя с помощью такого метода рисовать пунктирные линии например. Хотя с помощью небольшой допилки filltriangle можно. А если впилить простейшее текстурирование можно даже текстурами рисовать ))) Скриншоты всего этого безобразия выше. |
Ответ: Ошибка синтаксиса.
|
Ответ: Ошибка синтаксиса.
Что вы мучаетесь? Может мне легче библиотеку для рисования линии произвольной толщины написать? Будет работать немного быстрее и без глюков. Я вроде геометрию пока не всю забыл.
|
Ответ: Ошибка синтаксиса.
Цитата:
Цитата:
|
Ответ: Ошибка синтаксиса.
Цитата:
|
Ответ: Ошибка синтаксиса.
Цитата:
Но если есть какие-то стандартные средства в яве, чтобы пилить толстые линии - то конечно проще сделать либу, чем так извращатся. :) Вообще будет полезная штука я думаю, особенно если с паттернами (прерывистая там, пунктирная и тд) |
Ответ: Ошибка синтаксиса.
Цитата:
|
Ответ: Ошибка синтаксиса.
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 работать не будет вообще. |
Ответ: Отрисовка толстых линий
MIDP 1.0 скоро уйдет в историю как и старые профили мидлетов (не даром я их назвал "Под старину"), так что не стоит особо бояться проблем с совместимостью.
|
Ответ: Ошибка синтаксиса.
Вложений: 1
Вот вроде бы рабочий мой вариант:
Цитата:
АПД:Нужна библиотека Lib_gfx; А вообще, вот Все библиотеки(Вообще все)! |
Ответ: Отрисовка толстых линий
Как доведете до блеска алгоритм, я его тогда реализую на Java в виде отдельной библиотеки. Без проблем. Или добавлю функцию рисования толстых линий в Lib_gfx.
|
Ответ: Отрисовка толстых линий
Вложений: 1
Сегодня... Где-то в 2 часа ночи я закончил алгоритм. Вроде всё верно, фуууф...
ОНО РАБОТАЕТ! Цитата:
|
Ответ: Отрисовка толстых линий
Нет, нормально. Больше вряд ли сожмется. Можно конвертировать в либу.
Ждите обновления библиотеки LIb_gfx |
Ответ: Отрисовка толстых линий
Можно ещё сильнее!(наверное)! 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; Но там баги с округлением((( |
Ответ: Отрисовка толстых линий
odd сделал скачай последьнюю версию lib_gfx
|
Ответ: Отрисовка толстых линий
Цитата:
|
Ответ: Отрисовка толстых линий
Цитата:
|
Ответ: Отрисовка толстых линий
А есть готовое решение для рисования линий со сглаженными краями (antialiasing)?
|
Ответ: Отрисовка толстых линий
Цитата:
Однако надо не линиями пользоваться, а векторами(вершинами). Если есть угол, то нужно его найти функцией atan2(y,x)! Вроде в MidletPascal 3.3 есть такая возможность. Так, ну ещё надо сделать вид центрирования это четырёхугольника(из векторов) - надо половину необходимой ширины отделить на каждую вершину разрывая углы на -90 и 90... Сложно. |
Часовой пояс GMT +4, время: 06:20. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot