2010-03-08 2 views
0

извините за запутанное название, его очень сложно объяснить, что я хочу. Поэтому я создал это изображение :) alt text http://i48.tinypic.com/34jd5w2.pngImage Line Trace Math Help Hard To Explain

Хорошо, поэтому две КРАСНЫЕ точки - это точки на изображении. Расстояние между ними не важно.

То, что я хочу сделать, используя координаты двух точек, позанимайтесь углом пространства между ними (как показано черной линией между красными точками)

Затем, когда угол найден , на последней красной точке, создайте две точки, которые пересекают угол первой линии. Затем отсканируйте Полу полукруг и получите координаты каждого пикселя изображения, которое проходит оранжевая линия.

Я dnot знаю, если это имеет смысл для вас много, так что я нарисовал другую картину: alt text http://i48.tinypic.com/2mwsfly.png

Как вы можете видеть на втором снимке, моя идея применяется к линии, проведенной на черном canavs. Две красные точки - это начальные координаты, а затем в конце двух точек, создается меньше половины полукруга. В оранжевой части отображаются пиксели изображения, которые должны быть записаны.

Я понятия не имею, как начать, так что если у кого есть какие-либо идеи о том, как я могу или на то, что мне нужно сделать, любая помощь очень ценится :)

EDIT. Я создал этот образ в надежде, что он будет делать то, что я пытаюсь сделать понятнее :) alt text http://i50.tinypic.com/1zdyhkw.png

Опять же жаль, если это заблуждение никого, как я действительно не знаю, как это объяснить.

+0

Er ... * «Используя координаты для двух точек, выработайте угол между ними» * неясно. Угол между ними, как видно из некоторой третьей точки? Кроме того, вы показывали несколько синих точек в каждой фигуре, но ничего не говорили о них. Являются ли они точками, из которых измеряется «угол между [красными точками]»? Имеют ли они какое-либо значение вообще? Пожалуйста, попробуйте еще раз уточнить проблему. Я подозреваю, что у вас есть какой-то контекст, о котором мы не знаем. – dmckee

+0

Im пытается изо всех сил объяснить, все это немного за меня, но плохо придумал другой образ, который, надеюсь, даст небольшой контекст =) – Ozzy

+0

Я считаю, что «угол между двумя точками» - это только градиент линия. –

ответ

0

Просто для уточнения:

  • У вас есть две точки А & B, и вы должны нарисовать дугу
  • дуга должна быть четверть круга (так называемый «половина полукруг»)
  • первая точка А должна быть центром/точка поворота для дуги
  • линия определяется & B должна пересекать дугу в его средней точке

Определим координаты точки A как (Ax, Ay). Определим расстояние между & В качестве г (радиус нашей окружности/дуги)

Таким образом, используя основную формулу для окружности, в точке (х, у) будет находиться на окружности, когда

(x-Ax)^2 + (y-Ay)^2 = r^2 

Теперь вам просто нужно ограничить этот набор теми точками, которые находятся в пределах требуемого квартального круга. Я бы предположил, что самый простой способ сделать это - включить точки на определенном расстоянии от середины дуги.

Для этого сначала разработайте середину дуги.Пусть точка B определяется формулой (Bx, By), а затем определить точку С в качестве средней точки дуги (Cx, Cy)

Cx = Ax + (Ax-Bx) 
Cy = Ay + (Ay-By) 

Теперь для любой точки на дуге, нарисуйте аккорд (линию между двумя точками на окружности) от этой точки (x, y) до середины дуги.

Длина этой линии может быть рассчитана радиусом окружности и углом между двумя радиусами. Формула длины хорды равна 2r.sin (a/2), где r - радиус, a - угол между радиусами. Мы хотим, чтобы 45 градусов обе стороны от средней точки, так что максимальная длина хорды

2r.sin(45/2) 

Так точки внутри 2r.sin (45/2) нашей точки (Cx, Cy) будет достаточно близко, чтобы сделать четверть круг. Ваш результат:

Any coordinate (x, y) such that 
(x-Ax)^2 + (y-Ay)^2 = r^2 
(x-Cx)^2 + (y-Cy)^2 <= (2r.sin(45/2))^2 

Удачи!

0

Хм ... Я думаю, что получаю то, что вы связываете, но комментируйте, если я ошибаюсь.

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

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

Есть несколько способов, чтобы вычислить пересечение с окружностью, метод грубой силы будет применять итеративную формулу, как:

x = r * sin(t) 
y = r * cos(t) 

вокруг первой красную точки, где г ваше сканирование радиус.

Применяя формулу к вашей сетке пикселей, вы должны быть способны определить, какие пиксели являются решениями для обоих уравнений.

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

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

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

0

ОК, поэтому угол открытия постоянный, а поперечная линия - только для строительства. Хорошо.


Вы хотите использовать Bresenham circle для выбора точек, подлежащих сканированию.

Первая цифра конечных точек. Для этого вы немного вектор математике как этот

  • Пусть (х, у) координаты второй красной точки, R радиус вы с отсканировать в (вы не указали, но я предположим, что вы знаете, что это такое), а theta - угол отрезка линии от горизонтали. (Если вам нужна помощь в определении тета, просто скажите)
  • Конечные точки (X_i, Y_i) для i в [+, -]. Где

 

X_+ = x + R*cos(theta + 70) // angles expressed in degrees for ease here, 
Y_+ = y + R*sin(theta + 70) // your language probably expects radians 
X_- = x + R*cos(theta - 70) 
Y_- = y + R*sin(theta - 70) 

Обратите внимание, что тета должен работать весь круг (0--360 градусов или 0-2 \ пи радиан).

Затем вы используете алгоритм круга, чтобы выбрать пиксели (которые были бы окрашены, если бы вы рисовали, но копировались в этом случае), которые вы поместили в массив по порядку. И Бьорн Силдинг-твой твой дядя.