在圆上绘制线条

时间:2010-06-18 09:47:14

标签: math vector geometry java-me

在A和B之间的中心有一条A-B和C线。它如图所示形成一个圆圈。如果我们假设A-B线作为圆的直径,那么C就是它的中心。我的问题是我不知道如何在距离AC或AB各45度的地方绘制另外三条线(蓝色)。不,这不是作业,它是渲染中复杂几何体的一部分。

alt text http://www.freeimagehosting.net/uploads/befcd84d8c.png

5 个答案:

答案 0 :(得分:2)

有几种方法可以解决这个问题,其中一种方法是找到线的角度,然后再添加45度这几次。这是一个例子,它是用Python编写的,但是翻译数学应该很容易(而且我试图以简单的方式编写Python)。

以下是几行的输出:

alt text 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 :(得分:1)

如果你想找到蓝线的坐标,你可能会发现有关转换(旋转)的一些有用信息:

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

你需要旋转例如矢量AC,然后你可以找到蓝线终点的坐标。

答案 2 :(得分:1)

this开始,添加一个代码为

的按钮
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();
        }

编辑:无法看到你的照片所以我误解了你的问题,但这应该让你开始。

答案 3 :(得分:0)

在原点(即A-C)用C平移A,旋转CW 45°,然后平移。再重复三次。

答案 4 :(得分:0)

如果我这样做,我会使用polar co-ordinates(如果您已经很清楚它们是什么的话,请包含链接道歉)作为一种简单的方法来确定圆周上的点的坐标你需要的。然后从圆的中心画线到那里。