假设我有2分
Point p1 = new Pen(100, 100);
Point p2 = new Pen(200, 150);
我在给定半径的点上绘制椭圆,该点位于椭圆的中心。
int radius = 5;
RectangleF rectangle = new RectangleF();
rectangle.Width = radius * 2;
rectangle.Height = radius * 2;
rectangle.X = Convert.ToSingle(p1.X - radius);
rectangle.Y = Convert.ToSingle(p1.Y - radius);
g.FillEllipse(brush, rectangle);
rectangle.X = Convert.ToSingle(p2.X - radius);
rectangle.Y = Convert.ToSingle(p2.Y - radius);
g.FillEllipse(brush, rectangle);
g.DrawLine(pen, p1, p2);
如果我在这些点之间画线,我会从一个中心到另一个中心。 目前我可以忍受这一点,但我想说,那条线从Ellipse的边缘开始,所以它不会经历它。我怎么能做到这一点?
答案 0 :(得分:4)
找到答案:
public static PointF getPointOnCircle(PointF p1, PointF p2, Int32 radius)
{
PointF Pointref = PointF.Subtract(p2, new SizeF(p1));
double degrees = Math.Atan2(Pointref.Y, Pointref.X);
double cosx1 = Math.Cos(degrees);
double siny1 = Math.Sin(degrees);
double cosx2 = Math.Cos(degrees + Math.PI);
double siny2 = Math.Sin(degrees + Math.PI);
return new PointF((int)(cosx1 * (float)(radius) + (float)p1.X), (int)(siny1 * (float)(radius) + (float)p1.Y));
}
答案 1 :(得分:1)
你有两个选择,
1)先画线,然后用FillEllipse
2)移动线的起点和终点位置。
转移您需要的线路位置:
a )计算中心之间的角度
- 这是Theta = tan-1(y2-y1 / x2-x1)
如果使用实际的椭圆而不是圆圈:
b )计算该角度的椭圆半径
- 这是r(Theta)=(x * y)/ Sqrt(x * Cos(Theta)^ 2 + y * sin(Theta)^ 2)
c )计算线的偏移量
- 这是x = rCos(Theta)和y = rSin(Theta)