Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 19.04.2011, 15:06   #1
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию линия

вообщем есть функция рисующая линию
delphi Код:
procedure TLinePainter.PaintLine; var   i,path:integer;   v:real;   x,y:integer;   begin i:=abs(Start.X - Finish.X); path:=abs(Start.Y - Finish.Y); if path<i then path:=i; if path=0 then exit; for i:=0 to path do begin v:=(i / path); x:=Start.x + Round((Finish.x - Start.x) * v); y:=Start.y + Round((Finish.y - Start.y) * v); Form.Scene.Canvas.Pixels[x,y]:=clBlack; end; end;

первая линия на рисунке - нарисованая этой функцией, а вторая - так как надо нарисовать.
проще гря надо рисовать линию которая не может по-диагонали двигатся
Миниатюры
Нажмите на изображение для увеличения
Название: линия.JPG
Просмотров: 21
Размер:	12.5 Кб
ID:	2021  
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 19.04.2011, 16:33   #2
Местный
 
Регистрация: 11.03.2008
Сообщений: 529
Сказал Спасибо: 10
Имеет 111 спасибок в 71 сообщенях
Xa4ik пока неопределено
По умолчанию

так заарисовуются углы: (исправлено)
Код:
if (x<>x1) and (y<y1) then  Form.Scene.Canvas.Pixels[x-1,y]:=clBlack;
if (x<>x1) and (y>y1) then  Form.Scene.Canvas.Pixels[x+1,y]:=clBlack;
if (y<>y1) and (x<x1) then  Form.Scene.Canvas.Pixels[x,y+1]:=clBlack;
if (y<>y1) and (x>x1) then  Form.Scene.Canvas.Pixels[x,y-1]:=clBlack;
Form.Scene.Canvas.Pixels[x,y]:=clBlack;
x1:=x;
y1:=y;

Последний раз редактировалось Xa4ik, 19.04.2011 в 17:09.
Xa4ik вне форума   Ответить с цитированием
Старый 19.04.2011, 16:40   #3
Admin!
 
Аватар для xkor
 
Регистрация: 04.08.2007
Сообщений: 2,360
Сказал Спасибо: 113
Имеет 1,566 спасибок в 651 сообщенях
xkor на пути к лучшему
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
надо рисовать линию которая не может по-диагонали двигатся
что бы это могло означать
__________________
Я здесь практически не появляюсь!, Skype - ikskor
xkor вне форума   Ответить с цитированием
Старый 19.04.2011, 16:45   #4
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Тебе это именно для рисования, или все таки имеет отношение к поиску пути?)))

Цитата:
Сообщение от Xa4ik Посмотреть сообщение
Вторая в 2 пикселя толищиной, первая в 1.
думаю так:
Код:
Form.Scene.Canvas.Pixels[x,y]:=clBlack;
Form.Scene.Canvas.Pixels[x+1,y+1]:=clBlack;
сомнительно... Внимательно посмотри на рисунок, если именно 1 в 1 как у него... то на втором рисунке точка(3,5) должна быть в (4,4), если толщиной в 2 пикселя строить...

Если это тупо рисование пути (и ничего больше), то там только попиксельно (или извратиться с поиском прямых отрезков параллельно осям коодинат)
Aries вне форума   Ответить с цитированием
Старый 19.04.2011, 17:22   #5
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Цитата:
Сообщение от Aries Посмотреть сообщение
Тебе это именно для рисования, или все таки имеет отношение к поиску пути?)))


сомнительно... Внимательно посмотри на рисунок, если именно 1 в 1 как у него... то на втором рисунке точка(3,5) должна быть в (4,4), если толщиной в 2 пикселя строить...

Если это тупо рисование пути (и ничего больше), то там только попиксельно (или извратиться с поиском прямых отрезков параллельно осям коодинат)
мне надо проверять, если то одной точки до второй точки можно провести прямую и на этом отрезке нет препятствий - удаляем вторую точку и так со всеми, короче из массива точек отобрать только нужные
__________________
Начало.
supernewbie вне форума   Ответить с цитированием
Старый 19.04.2011, 18:43   #6
Местный
 
Аватар для Nickers
 
Регистрация: 23.11.2009
Сообщений: 574
Сказал Спасибо: 134
Имеет 117 спасибок в 82 сообщенях
Nickers пока неопределено
По умолчанию

supernewbie, а что ты конструируешь такое? А то у тебя постоянно геометрические впросы, аж интересно...
(Если ответ: "Иди ёбни ломату дерьма убейся", то я пойму)
__________________
Пишу что думаю, но ничего не знаю...
[LameGuard|Скрипты l2phx]
Nickers вне форума   Ответить с цитированием
Старый 19.04.2011, 18:53   #7
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

дык алгоритм пути по геодате, сам путь есть в виду координат, надо отрезать лишние точки, чтобы посылать мув то локейшен только в точки в которые можно провести прямую линию и на ней не будет препятствий, для этого сначала эту прямую линию надо провести)

Добавлено через 2 минуты
памагите пасаны
__________________
Начало.

Последний раз редактировалось supernewbie, 19.04.2011 в 18:53. Причина: Добавлено сообщение
supernewbie вне форума   Ответить с цитированием
Старый 19.04.2011, 19:23   #8
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
дык алгоритм пути по геодате, сам путь есть в виду координат, надо отрезать лишние точки, чтобы посылать мув то локейшен только в точки в которые можно провести прямую линию и на ней не будет препятствий, для этого сначала эту прямую линию надо провести)

Добавлено через 2 минуты
памагите пасаны
Так тут все более чем просто... Путь не является прямой линией, поэтому мысль с построением линии без диагональных переходов - как-то бредова))

Суть такая:
Код:
coord A = CurrentCoord();
coord B = CurrentCoord();
while (A != EndPoint) {
  bool Flag = false, ShiftX=false, ShiftY=false;
  while (!Flag) {
    if(A.x != B.x) ShiftX=true;
    if(A.y != B.y) ShiftY=true;
    if(B == EndPoint) Flag = true;
    if (ShiftX && ShiftY) {
        Flag = true;
        B = PrevPoint();
    }
    else B = NextPoint();
  }
  moveto(B);
  A = B;
}
эт если я правильно понял что тебе надо)
Т.е. мы строим прямую линии до ближайшего диагонального перехода, идем к нему, от него начинаем строить дальше и т.д.... Если нужно изначально все точки просто пробить, то вместо moveto(B) записывай себе куда-нить эту координату и все

Добавлено через 6 минут
Цитата:
Сообщение от mira Посмотреть сообщение
он боитса что диагональная линия пути проскочит между двумя такимиже диагональным пикселами геодаты как я понимаю) и получитса типа как итти можно.
нет, как я понял, у него путь готовый есть уже) просто ему нужно сделать координаты контрольных точек, чтоб не писать MoveTo на каждую точку пути)))

хотя мб я как всегда не допонял что-то))
А если ты прав, то это говорит о том, что выбранный алгоритм для поиска пути заведомо неверный, раз ищет не в 4 направления, а в 8)))

Последний раз редактировалось Aries, 19.04.2011 в 19:26. Причина: Добавлено сообщение
Aries вне форума   Ответить с цитированием
Старый 19.04.2011, 19:35   #9
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

Цитата:
Сообщение от Aries Посмотреть сообщение
у него путь готовый есть уже) просто ему нужно сделать координаты контрольных точек, чтоб не писать MoveTo на каждую точку пути)))
вот именно так, есть массив точек xyz пути, надо удалить лишние посредством провода прямых линий, а в геодате по диагонали нельзя двигатса

Добавлено через 1 минуту
Цитата:
Сообщение от mira Посмотреть сообщение
а ты попробуй рисавать еще 1 линию вплотную к этой со сдвигом в один пиксель. если обе линии проходят то вперед, пока в мою светлую голову не приходит ничего другова ))
но это хренова :\ так лишние точки будут задействованы и тупить всё будет

вот на рисунке - синие точки это все точки из массива точек пути, бордовым отмечено какие точки должны остатся путём провода линий и узнавания что можно валить нанапрямую
Миниатюры
Нажмите на изображение для увеличения
Название: пример.PNG
Просмотров: 31
Размер:	13.2 Кб
ID:	2023  
__________________
Начало.

Последний раз редактировалось supernewbie, 19.04.2011 в 19:39. Причина: Добавлено сообщение
supernewbie вне форума   Ответить с цитированием
Старый 19.04.2011, 19:41   #10
Местный
 
Аватар для Aries
 
Регистрация: 19.01.2011
Сообщений: 241
Сказал Спасибо: 7
Имеет 26 спасибок в 22 сообщенях
Aries пока неопределено
По умолчанию

Цитата:
Сообщение от supernewbie Посмотреть сообщение
вот именно так, есть массив точек xyz пути, надо удалить лишние посредством провода прямых линий, а в геодате по диагонали нельзя двигатса
ну так идею вычисления нужных точек я тебе написал... Проверка на Z координату там походу и не нужна вообще будет.

Добавлено через 2 минуты
эм... Эт как же ты эти бордовые точки выбрал? по какой логике?))

Последний раз редактировалось Aries, 19.04.2011 в 19:41. Причина: Добавлено сообщение
Aries вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!