Нарисуйте линии по кругу - PullRequest
1 голос
/ 18 июня 2010

Есть линия AB и C в центре между A и B. Она образует круг, как на рисунке.Если мы примем линию AB в качестве диаметра круга, а C - это его центр.Моя проблема в том, что я понятия не имею, как нарисовать еще три линии (синим цветом), каждый на 45 градусов от AC или AB.Нет, это не домашняя работа, это часть моей сложной геометрии в рендеринге.

альтернативный текст http://www.freeimagehosting.net/uploads/befcd84d8c.png

Ответы [ 5 ]

2 голосов
/ 19 июня 2010

Есть несколько способов решить эту проблему, один из которых состоит в том, чтобы найти угол линии и затем добавить 45 градусов к этому несколько раз.Вот пример, он написан на Python, но перевод математики должен быть легким (и я попытался написать Python упрощенно).

Вот вывод для нескольких строк:

альтернативный текст http://i47.tinypic.com/2q8uc20.png

Основная функция - calc_points, остальное - просто дать ему A и B, которые пересекают круг, и построить графики.

from math import atan2, sin, cos, sqrt, pi
from matplotlib import pyplot

def calc_points(A, B, C):
    dx = C[0]-A[0]
    dy = C[1]-A[1]
    line_angle = atan2(dy, dx)
    radius = sqrt(dy*dy + dx*dx)
    new_points = []
    # now go around the circle and find the points
    for i in range(3):
        angle = line_angle + (i+1)*45*(pi/180)  # new angle in radians
        x = radius*cos(angle) + C[0]
        y = radius*sin(angle) + C[1]
        new_points.append([x, y])
    return new_points

# test this with some reasonable values
pyplot.figure()
for i, a in enumerate((-20, 20, 190)):
    radius = 5
    C = [2, 2]
    # find an A and B on the circle and plot them
    angle = a*(pi/180)
    A = [radius*cos(pi+angle)+C[0], radius*sin(pi+angle)+C[1]]
    B = [radius*cos(angle)+C[0], radius*sin(angle)+C[1]]
    pyplot.subplot(1,3,i+1)
    pyplot.plot([A[0], C[0]], [A[1], C[1]], 'r')
    pyplot.plot([B[0], C[0]], [B[1], C[1]], 'r')
    # now run these through the calc_points function and the new lines
    new_points = calc_points(A, B, C)
    for np in new_points:
        pyplot.plot([np[0], C[0]], [np[1], C[1]], 'b')
    pyplot.xlim(-8, 8)
    pyplot.ylim(-8, 8)
    for x, X in (("A", A), ("B", B), ("C", C)):
        pyplot.text(X[0], X[1], x)

pyplot.show()
1 голос
/ 18 июня 2010

начните с этого и добавьте кнопку с кодом:

private void btnCircleLined_Click(object sender, System.EventArgs e)
        {
            Graphics graph = Graphics.FromImage(DrawArea);
            int x = 100, y = 100, diameter = 50;

            myPen.Color = Color.Green;
            myPen.Width = 10;

            graph.DrawEllipse(myPen, x, y, diameter, diameter);
            myPen.Color = Color.Red;
            double radian = 45 * Math.PI / 180;
            int xOffSet = (int)(Math.Cos(radian) * diameter / 2);
            int yOffSet = (int)(Math.Sin(radian) * diameter / 2);
            graph.DrawLine(myPen, x, y + yOffSet + myPen.Width + diameter / 2, x + xOffSet + myPen.Width + diameter / 2, y);
            graph.DrawLine(myPen, x, y, x + xOffSet + myPen.Width + diameter / 2, y + yOffSet + myPen.Width + diameter / 2);
            graph.Dispose();
            this.Invalidate();
        }

edit: не удалось увидеть вашу фотографию, поэтому я неправильно понял ваш вопрос, но это должно помочь вам начать.

1 голос
/ 18 июня 2010

Если вы хотите найти координаты синих линий, возможно, вам будет полезна некоторая информация о преобразованиях (вращениях):

http://en.wikipedia.org/wiki/Rotation_matrix

Вам нужно повернуть, например, вектор AC, а затем найти координату конечной точки синей линии.

0 голосов
/ 18 июня 2010

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

0 голосов
/ 18 июня 2010

Переведите A с буквой C в начале координат (то есть AC), поверните CW на 45 °, затем переведите обратно.Повторите еще три раза.

...