Как укоротить углы? - PullRequest
       28

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

6 голосов
/ 01 апреля 2011

Хруст хруста.

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

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

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

originalwidth-scrunchedheight-scrunched

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

Ответы [ 2 ]

1 голос
/ 08 марта 2013

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

Основная техника работает так:

  1. Определить координаты X и Y для необожженных конечных точек
  2. Scrunch тех, кто использует простое масштабирование, чтобы получить координаты 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 для начальной и конечной точек. Вот формулы для начала 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 ведет вниз по странице). Да, не совсем верно, что я перевернул это, но исправил угол .. .sorry!

Далее мы вычисляем сжатые 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. Опять же, немного отличается от вашего, но не сильно.

1 голос
/ 02 апреля 2011

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

Общий подход состоит в том, чтобы определить конечные точки в координатах 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') = новый конечный угол

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

...