Помогите исправить алгоритм
-
- Гуру
- Сообщения: 527
- Зарегистрирован: 21 окт 2012, 00:17
- Репутация: 15
- Ваше звание: developer
Помогите исправить алгоритм
На вход поступает сектор, у которого есть: центр координат - ТОЧКА(это откуда два луча вылазят), внутренний и внешний радиусы(INNER_R и TOTAL_R), угол больший(OPENING) и угол меньший(AZI).
Этот сектор вначале формируется по этим данным. А затем рисуется на карте(средствами от ESRI). Алгоритм построения дебильный, на шарпе:
1. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус rad в ПИКСЕЛЯХ.
2. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии внешнего радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус radinn в ПИКСЕЛЯХ.
3. Преобразуем координаты центра(ТОЧКА) в пиксельные(IPoint CentrePointScreen) на экране.
4. Нормализуем данные, преобразуем углы в радианы.
5. Находим КООРДИНАТЫ в пикселях - первая точка сектора на расстоянии радиуса и первым углом.
вторая точка сектора на расстоянии радиуса и вторым углом.
6. Переводим все экранные координаты точек в координаты карты. По ним рисуем фигуру.
Т.е. механизм такой вот тригонометрический: вначале все преобразовываем в пиксельные данные, че-то делаем и преобразовываем результат в координаты карты.
Я бы забил на этот *код, есди бы он работал правильно. Но вот беда: рисуется какая-то фигня. Если изначально зазумировать карту поближе, то рисуется тоже фигня, но уже больше похожая на правду.
Мне заявили, что алгоритм хороший, а просто криворукие программисты ESRI накосячили в функциях рисования на карте. В таком случае есть очень плохой, ненадежный и тормознутый способ исправления этой проблемы.
Поближе зумировать карту(на размер самого маленького полигона). А затем применять этот чудесный алгоритм и рисовать на карте(причем не факт что это исправление проблемы)
Но я думаю, что криворукий кто-то другой. Подскажите, пожалуйста, как исправить этот алгоритм(возможно ли это в принципе), чтобы фигуры рисовались правильно.
Этот сектор вначале формируется по этим данным. А затем рисуется на карте(средствами от ESRI). Алгоритм построения дебильный, на шарпе:
1. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус rad в ПИКСЕЛЯХ.
2. Находим расстояние в пикселях между точкой центра(ТОЧКА) и точкой на расстоянии внешнего радиуса(INNER_R): в течении 20 строк *кода вычисляем радиус radinn в ПИКСЕЛЯХ.
3. Преобразуем координаты центра(ТОЧКА) в пиксельные(IPoint CentrePointScreen) на экране.
4. Нормализуем данные, преобразуем углы в радианы.
5. Находим КООРДИНАТЫ в пикселях - первая точка сектора на расстоянии радиуса и первым углом.
вторая точка сектора на расстоянии радиуса и вторым углом.
6. Переводим все экранные координаты точек в координаты карты. По ним рисуем фигуру.
Т.е. механизм такой вот тригонометрический: вначале все преобразовываем в пиксельные данные, че-то делаем и преобразовываем результат в координаты карты.
Я бы забил на этот *код, есди бы он работал правильно. Но вот беда: рисуется какая-то фигня. Если изначально зазумировать карту поближе, то рисуется тоже фигня, но уже больше похожая на правду.
Мне заявили, что алгоритм хороший, а просто криворукие программисты ESRI накосячили в функциях рисования на карте. В таком случае есть очень плохой, ненадежный и тормознутый способ исправления этой проблемы.
Поближе зумировать карту(на размер самого маленького полигона). А затем применять этот чудесный алгоритм и рисовать на карте(причем не факт что это исправление проблемы)
Но я думаю, что криворукий кто-то другой. Подскажите, пожалуйста, как исправить этот алгоритм(возможно ли это в принципе), чтобы фигуры рисовались правильно.
Последний раз редактировалось novice 08 июл 2013, 16:20, всего редактировалось 1 раз.
-
- Гуру
- Сообщения: 5356
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Помогите исправить алгоритм
в пикселях то зачем???
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Помогите исправить алгоритм
Вы описали, что нужно подавать на вход, но не сказали, что хотите получить на выходеnovice писал(а):На вход поступает сектор, у которого есть: центр координат - ТОЧКА(это откуда два луча вылазят), внутренний и внешний радиусы(INNER_R и TOTAL_R), угол больший(OPENING) и угол меньший(AZI)

-
- Гуру
- Сообщения: 527
- Зарегистрирован: 21 окт 2012, 00:17
- Репутация: 15
- Ваше звание: developer
Re: Помогите исправить алгоритм
это мастер класс от наших гуру кодинга.в пикселях то зачем???
надо получить координаты трех точек(на конце одной стороны сектора, на конце другой, и одну посередине), чтобы затем нарисовать сектор(два отрезка и дугу между ними). Координаты центра уже есть.что хотите получить на выходе
к сожалению сейчас нет. На меня накинули пару десятков задач. А эта задача по другому проекту, которую я тоже должен сделать, и возможно скоро. Но не соображу как написать алгоритм и нет времени думать, может кто сталкивался? Если можно было бы переделать этот алгоритм, то тогда не пришлось бы возиться с этой веткой кода(несколько тысяч строк - жесть, да?), по крайне мере в ближайшее время.или же у вас нет возможности реализовать свою версию алгоритма
-
- Гуру
- Сообщения: 5356
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Помогите исправить алгоритм
Картинку бы, но мне кажется
1. Вместо маяты с пикселями,просто определить масштабный коэффициент
2. Задачка сводится к переходу от полярных координат к декартовым
1. Вместо маяты с пикселями,просто определить масштабный коэффициент
2. Задачка сводится к переходу от полярных координат к декартовым
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Помогите исправить алгоритм
Насчет картинки согласен. Потому, что без нее кажется, что или задача решается крайне примитивно, или мы ее неверно понимаем. Во всяком случае, расширю п. 2: по известным координатам центра сектора (x, y), заданному радиусу (r) и углу (a) легко получить координаты точки, лежащей на окружности в направлении угла:trir писал(а):Картинку бы, но мне кажется
1. Вместо маяты с пикселями,просто определить масштабный коэффициент
2. Задачка сводится к переходу от полярных координат к декартовым
Код: Выделить всё
newX = x + r*cos(a)
newY = y + r*sin(a)
-
- Гуру
- Сообщения: 5356
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1021
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Помогите исправить алгоритм
Код: Выделить всё
newX = x + k*r*cos(a)
newY = y + k*r*sin(a)
-
- Гуру
- Сообщения: 527
- Зарегистрирован: 21 окт 2012, 00:17
- Репутация: 15
- Ваше звание: developer
Re: Помогите исправить алгоритм
Спасибо, действительно, надо было выкинуть весь чужой г*код, где использовались пиксели и весь код, отвечающий за рисование полигонов, и весь смежный код.
Сектор рисую следующим образом. Вычисляю координаты 6 точек(3 на внутренней дуге, 3 на внешней). Рисую окантовку - две дуги, две линии и точка. Рисую полигон. Для этого превращаю дуги в наборы линий с помощью интерфейса IGeometryBridge. Затем по порядку заношу координаты в список, затем рисую полигон.
Но теперь вопрос - как сделать выделение этого сектора по клику. Так как стандартное выделение - УГ, т.к. выделяет либо все объекты, либо общие границы области - оба варианта ни о чем. Хотелось бы чтобы при выделении сектора менялся цвет окантовки и толщина линий.
Собственно вопрос: можно ли стандартными средствами задать цвет и толщину линий, не удаляя их с контейнера карты? Т.е. с удалением то понятно: удалил старые объекты, нарисовал новые. Но код написан так отвратительно, что такая небольшая правка потребует переписывания тысячи строк кода, а возможно и больше.
Сектор рисую следующим образом. Вычисляю координаты 6 точек(3 на внутренней дуге, 3 на внешней). Рисую окантовку - две дуги, две линии и точка. Рисую полигон. Для этого превращаю дуги в наборы линий с помощью интерфейса IGeometryBridge. Затем по порядку заношу координаты в список, затем рисую полигон.
Но теперь вопрос - как сделать выделение этого сектора по клику. Так как стандартное выделение - УГ, т.к. выделяет либо все объекты, либо общие границы области - оба варианта ни о чем. Хотелось бы чтобы при выделении сектора менялся цвет окантовки и толщина линий.
Собственно вопрос: можно ли стандартными средствами задать цвет и толщину линий, не удаляя их с контейнера карты? Т.е. с удалением то понятно: удалил старые объекты, нарисовал новые. Но код написан так отвратительно, что такая небольшая правка потребует переписывания тысячи строк кода, а возможно и больше.
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость