在A和B之间的中心有一条A-B和C线。它如图所示形成一个圆圈。如果我们假设A-B线作为圆的直径,那么C就是它的中心。我的问题是我不知道如何在距离AC或AB各45度的地方绘制另外三条线(蓝色)。不,这不是作业,它是渲染中复杂几何体的一部分。
alt text http://www.freeimagehosting.net/uploads/befcd84d8c.png
答案 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(如果您已经很清楚它们是什么的话,请包含链接道歉)作为一种简单的方法来确定圆周上的点的坐标你需要的。然后从圆的中心画线到那里。