2

假设我有 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);

如果我在这些点之间画线,我会得到从一个中心到另一个中心的线。目前我可以忍受,但我想做,那条线从椭圆的边缘开始,所以它不会穿过它。我怎么能做到这一点?

4

2 回答 2

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));
    }
于 2012-05-22T00:19:24.760 回答
1

你有2个选择,

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)




于 2012-04-30T10:30:11.523 回答