Помогите исправить алгоритм

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Помогите исправить алгоритм

Сообщение novice »

На вход поступает сектор, у которого есть: центр координат - ТОЧКА(это откуда два луча вылазят), внутренний и внешний радиусы(INNER_R и TOTAL_R), угол больший(OPENING) и угол меньший(AZI).

Этот сектор вначале формируется по этим данным. А затем рисуется на карте(средствами от ESRI). Алгоритм построения дебильный, на шарпе:

1. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус rad в ПИКСЕЛЯХ.
2. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии внешнего радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус radinn в ПИКСЕЛЯХ.
3. Преобразуем координаты центра(ТОЧКА) в пиксельные(IPoint CentrePointScreen) на экране.
4. Нормализуем данные, преобразуем углы в радианы.
5. Находим КООРДИНАТЫ в пикселях - первая точка сектора на расстоянии радиуса и первым углом.
вторая точка сектора на расстоянии радиуса и вторым углом.
6. Переводим все экранные координаты точек в координаты карты. По ним рисуем фигуру.

Т.е. механизм такой вот тригонометрический: вначале все преобразовываем в пиксельные данные, че-то делаем и преобразовываем результат в координаты карты.
Я бы забил на этот *код, есди бы он работал правильно. Но вот беда: рисуется какая-то фигня. Если изначально зазумировать карту поближе, то рисуется тоже фигня, но уже больше похожая на правду.

Мне заявили, что алгоритм хороший, а просто криворукие программисты ESRI накосячили в функциях рисования на карте. В таком случае есть очень плохой, ненадежный и тормознутый способ исправления этой проблемы.
Поближе зумировать карту(на размер самого маленького полигона). А затем применять этот чудесный алгоритм и рисовать на карте(причем не факт что это исправление проблемы)

Но я думаю, что криворукий кто-то другой. Подскажите, пожалуйста, как исправить этот алгоритм(возможно ли это в принципе), чтобы фигуры рисовались правильно.
Последний раз редактировалось novice 08 июл 2013, 16:20, всего редактировалось 1 раз.
trir
Гуру
Сообщения: 5356
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Помогите исправить алгоритм

Сообщение trir »

в пикселях то зачем???
KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите исправить алгоритм

Сообщение KolesovDmitry »

novice писал(а):На вход поступает сектор, у которого есть: центр координат - ТОЧКА(это откуда два луча вылазят), внутренний и внешний радиусы(INNER_R и TOTAL_R), угол больший(OPENING) и угол меньший(AZI)
Вы описали, что нужно подавать на вход, но не сказали, что хотите получить на выходе :) Правильно ли я понимаю, что вам нужно отрисовать кусок сектора на карте? Не очень понятно, в чем проблема -- вы хотите переписать алгоритм заново, но столкнулись с трудностями (тогда какими?) или же у вас нет возможности реализовать свою версию алгоритма (тогда о чем вообще вопрос - непонятно)?
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: Помогите исправить алгоритм

Сообщение novice »

в пикселях то зачем???
это мастер класс от наших гуру кодинга.
что хотите получить на выходе
надо получить координаты трех точек(на конце одной стороны сектора, на конце другой, и одну посередине), чтобы затем нарисовать сектор(два отрезка и дугу между ними). Координаты центра уже есть.
или же у вас нет возможности реализовать свою версию алгоритма
к сожалению сейчас нет. На меня накинули пару десятков задач. А эта задача по другому проекту, которую я тоже должен сделать, и возможно скоро. Но не соображу как написать алгоритм и нет времени думать, может кто сталкивался? Если можно было бы переделать этот алгоритм, то тогда не пришлось бы возиться с этой веткой кода(несколько тысяч строк - жесть, да?), по крайне мере в ближайшее время.
trir
Гуру
Сообщения: 5356
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Помогите исправить алгоритм

Сообщение trir »

Картинку бы, но мне кажется
1. Вместо маяты с пикселями,просто определить масштабный коэффициент
2. Задачка сводится к переходу от полярных координат к декартовым
KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Re: Помогите исправить алгоритм

Сообщение KolesovDmitry »

trir писал(а):Картинку бы, но мне кажется
1. Вместо маяты с пикселями,просто определить масштабный коэффициент
2. Задачка сводится к переходу от полярных координат к декартовым
Насчет картинки согласен. Потому, что без нее кажется, что или задача решается крайне примитивно, или мы ее неверно понимаем. Во всяком случае, расширю п. 2: по известным координатам центра сектора (x, y), заданному радиусу (r) и углу (a) легко получить координаты точки, лежащей на окружности в направлении угла:

Код: Выделить всё

newX = x + r*cos(a)
newY = y + r*sin(a)
trir
Гуру
Сообщения: 5356
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

Re: Помогите исправить алгоритм

Сообщение trir »

Код: Выделить всё

newX = x + k*r*cos(a)
newY = y + k*r*sin(a)
где k - масштабный коэффициент
novice
Гуру
Сообщения: 527
Зарегистрирован: 21 окт 2012, 00:17
Репутация: 15
Ваше звание: developer

Re: Помогите исправить алгоритм

Сообщение novice »

Спасибо, действительно, надо было выкинуть весь чужой г*код, где использовались пиксели и весь код, отвечающий за рисование полигонов, и весь смежный код.

Сектор рисую следующим образом. Вычисляю координаты 6 точек(3 на внутренней дуге, 3 на внешней). Рисую окантовку - две дуги, две линии и точка. Рисую полигон. Для этого превращаю дуги в наборы линий с помощью интерфейса IGeometryBridge. Затем по порядку заношу координаты в список, затем рисую полигон.

Но теперь вопрос - как сделать выделение этого сектора по клику. Так как стандартное выделение - УГ, т.к. выделяет либо все объекты, либо общие границы области - оба варианта ни о чем. Хотелось бы чтобы при выделении сектора менялся цвет окантовки и толщина линий.

Собственно вопрос: можно ли стандартными средствами задать цвет и толщину линий, не удаляя их с контейнера карты? Т.е. с удалением то понятно: удалил старые объекты, нарисовал новые. Но код написан так отвратительно, что такая небольшая правка потребует переписывания тысячи строк кода, а возможно и больше.
Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость