Как скрутить углы?

Хруст хруст.

Используя вычисления из Получение конечной точки в ArcSegment с помощью Start X/Y и Start+Sweep Angles, как я могу сжать или раздуть (-ify) углы.

См. изображения ниже. Зеленая коробка оригинальная. Желтые линии показывают, каким должен быть начальный/конечный угол в сжатом или надутом состоянии, а красная линия указывает на то, что исходный угол start=169, end=293 сохраняется на сжатых или надутых эллиптических дугах.

Мне нужен способ выяснить, как создать новые углы начала/конца на основе исходных значений в зеленом поле и значений высоты/ширины/xRadius/yRadius в синем и оранжевом полях.

оригиналсжатый по ширинесжатый по высоте

Кто-нибудь знает расчет, чтобы выяснить, каким должен быть новый угол?


person Stan    schedule 01.04.2011    source источник
comment
Почему начальные точки между красной и желтой линиями разные, если меняется только угол?   -  person BlueRaja - Danny Pflughoeft    schedule 01.04.2011
comment
Извините, что не ясно выразился. Это связано с тем, что текущая позиция пера начального угла не масштабируется при масштабировании эллипса. Это 58% высоты ограничивающей рамки на желтом фоне. Красный меняется, хотя не совсем уверен, почему.   -  person Stan    schedule 01.04.2011
comment
Вам придется включить некоторый код, потому что я до сих пор не понимаю, почему начальная точка кривой меняется.   -  person BlueRaja - Danny Pflughoeft    schedule 02.04.2011
comment
@BlueRaja - Дэнни Пфлугхофт: Для этого нет кода, но я могу точно сказать, как его воспроизвести. Возьмите все три картинки выше, вставьте в PowerPoint. Скопируйте зеленый дважды. Затем, отредактировав две зеленые картинки, возьмите одну из них и масштабируйте ее по ширине до 75% (соотношение сторон не сохраняйте). Возьмите другой и увеличьте его высоту до 75%. Убедитесь, что к этим двум применена прозрачность не менее 50%. Затем наложите их поверх оранжевого и синего соответственно. Вы увидите, что масштабированные начальные и конечные углы почти точно совпадают с синими и оранжево-желтыми дугами.   -  person Stan    schedule 02.04.2011
comment
Вы решили свою проблему? Меня интересует решение! Прямо сейчас я не меняю свой угол, я провожу прямую линию от конечной точки до начала моей новой линии.   -  person Danielle Paquette-Harvey    schedule 05.11.2012


Ответы (2)


Если подумать, что на самом деле делает этот код, то он очень похож на вертикальную или горизонтальную шкалу (кстати, какая из них подойдет?). Я думаю, что это дает нам ключ к разгадке, не углубляясь в специфическую для эллипса геометрию.

Общий подход состоит в том, чтобы определить конечные точки в координатах x,y на основе настроек угла и радиуса, применить масштабные коэффициенты, а затем преобразовать обратно в углы. Первое, что нам также нужно знать, это центр эллипса. Что мы знаем, так это начальную и конечную точки, а также начальный и конечный углы. Имея эту информацию, мы можем составить очень простой набор уравнений и решить: ((x,y) — центр эллипса)

(yEnd-y)/(xEnd-x) = tan(endAngle) = наклон линии от центра к конечной точке (yStart-y)/(xStart-x) = tan(startAngle) = наклон линии от центра к начальной точке

С помощью этой полезной информации мы теперь можем вычислить новый центр (x', y'), радиусы x и y и конечную точку (xEnd', yEnd') с помощью коэффициентов масштабирования. (Я считаю, что начальная точка по определению равна 0,0, но при необходимости измените ее).

x' = x * xScale, y' = y*yScale xEnd' = xEnd * xScale, yEnd' = yEnd * yScale

xRadius' = xRadius * xScale, yRadius' = yRadius * yScale

Теперь нам нужно определить новые углы.

Math.Atan2(yStart', xStart') = новый начальный угол Math.Atan2(yEnd', xEnd') = новый конечный угол

Имеет ли смысл эта стратегия?

person J Trana    schedule 02.04.2011
comment
Вау, это выглядит очень многообещающе. К сожалению, я не могу заставить его работать в Excel (очень жаль, я хорош во многих вещах, но не в математике). Ваш код работает с приведенными выше примерами? Разве центр эллипса не будет просто пересечением xRadius и yRadius значений, перечисленных выше? Или это центр исходного, а не масштабированного? - person Stan; 02.04.2011
comment
Кстати, единственные неизвестные значения в оранжевом и синем прямоугольниках — это начальный/конечный углы. Остальная информация известна (текущее местоположение пера, радиусы x и y и ширина/высота ограничивающей рамки). - person Stan; 02.04.2011
comment
Думаю, из вашего другого поста я предположил, что вы используете WPF, поэтому я использовал такие вещи .NET, как Atan2. Это верное предположение? - person J Trana; 05.04.2011

Я написал таблицу, чтобы вычислить это. Вы можете увидеть его по адресу https://skydrive.live.com/redir?resid=23B7BEDE6527529E!529&authkey=!AGboDW72AySsnK8, если хотите. (Это должно создать рабочую онлайн-версию, но вы также сможете ее загрузить.)

Основная техника работает следующим образом:

  1. Вычислите координаты X и Y для несжатых конечных точек.
  2. Сократите те, которые используют простое масштабирование, чтобы получить координаты X и Y для желаемых конечных точек.
  3. Вернитесь от них к углам

Это включает в себя довольно много вычислений. Вы можете следить за этим в этой электронной таблице, но вот все шаги:

Во-первых, я преобразую ваши углы, чтобы использовать соглашения о координатной геометрии - насколько я могу судить, вы измеряете по часовой стрелке от 3 часов, но в координатной геометрии более нормально, чтобы положительный угол был против часовой стрелки. Таким образом, ваши начальный и конечный углы становятся равными 191 и 67 градусам соответственно. (Я сделал это, потому что нахожу математику менее запутанной.))

Затем электронная таблица вычисляет радиус в начальной и конечной точках. Вот формулы, которые я использую для начальной и конечной точек:

=D2*D3/SQRT(POWER(D3*COS(RADIANS(D4)),2) + POWER(D2*SIN(RADIANS(D4)),2))
=D2*D3/SQRT(POWER(D3*COS(RADIANS(D5)),2) + POWER(D2*SIN(RADIANS(D5)),2))

D2 и D3 — это радиусы X и Y. D4 — начальный угол, а D5 — конечный угол (с поправкой на «обычные» углы). Я получил эту формулу из статьи Википедии на Эллипсы в разделе "Полярная форма относительно центра" . Это уравнение принимает угол и говорит вам, какой радиус эллипса будет под этим углом.

Затем я использую это для вычисления координат X и Y для начальной и конечной точек. Вот формулы для Start X и Y:

=$B$8*COS(RADIANS(D4)) + D2
=D3-$B8*SIN(RADIANS(D4))

Как упоминалось ранее, D2 и D3 — это радиусы X и Y, а D4 — начальный угол. (Формулы для конца X и Y выглядят одинаково только с D5. Причина добавления радиуса X заключается в том, что без этого числа варьируются от -Xradius до +Xradius. Добавление этого означает, что они варьируются от 0 до ширины. Ось Y не что-то похожее, но я инвертировал его, чтобы получить координаты экрана, потому что системы компьютерной графики часто имеют тенденцию переворачивать это (где увеличение Y идет вниз по странице) Да, это не совсем последовательно, что я инвертировал это, но исправил угол. .Извините!

Далее мы вычисляем сжатые X и Y. Вот формулы для начальной точки:

=B9/B2*B13
=B10/B3*B14

B9 и B10 — это X и Y предварительного растяжения, рассчитанные на предыдущем шаге. B2 и B3 — исходная ширина и высота, а B13 и B14 — сжатая ширина и высота. (Конечные формулы, конечно, выглядят очень похоже.) Итак, это простая операция масштабирования.

Наконец, мы вычисляем угол из них. Вот формула начального угла (и конечный угол почти идентичен)

=MOD(DEGREES(ATAN2(B16 - $D$13, $D$14-B17)), 360)

Функция ATAN2 принимает координаты X и Y и сообщает вам угол линии от начала координат до этой точки X, Y. Excel работает в радианах, поэтому нам нужно преобразовать это обратно в градусы (точно так же, как я преобразовывал градусы в радианы в более ранних формулах). А потом я беру MOD 360, чтобы избежать негативных ракурсов. ATAN2 никогда не выдает значений, превышающих PI (т. е. 180 градусов), и выдает отрицательные значения для углов, превышающих это значение. Взяв это по модулю 360, мы вернемся к положительному числу.

И затем последний шаг — преобразовать это обратно в систему углов по часовой стрелке:

= 360 - B19

Скармливая ваши растянутые размеры 1,88/3,4, мы получаем 165,51 и 287,70 градусов. Это не совсем совпадает с вашими цифрами, но я пытаюсь выяснить, откуда вы их взяли. Делаются ли они на глаз? А при подаче 2,5/2,55 у меня получается 171,71 и 299,51. Опять же, немного отличается от вашего, но не сильно.

person Ian Griffiths    schedule 08.03.2013