2012-04-30 3 views
1

Скажем, у меня есть 2 очкаC# нарисовать линию от окружности края до края окружности

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); 

Если я рисую линию между этими точками, я получаю линию от одного центра к другому. На данный момент я могу жить с этим, но я бы хотел, чтобы эта линия начиналась на краю Эллипса, поэтому она не проходит через нее. Как я мог это достичь?

ответ

2

Найдено ответ:

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

У вас есть 2 варианта,

1) Проведем линию первого и просто переписать его с FillEllipse

2) Сдвинуть начальную и конечную позицию строки.

изменить позиции строки вам необходимо:
) вычислить угол между центрами.
-Это Тета = загар-1 (y2-y1/x2-x1)
, если с использованием фактических эллипсы вместо кругов:
б) вычислить радиус эллипса для этого угла.
-Это г (Theta) = (х * у)/SQRT (х * Cos (Theta)^2 + у * Sin (Theta)^2)
с) вычислить смещение линии.
-Этот х = RCOs (Theta) и у = RSIN (Theta)

+0

Я попытаюсь 2-й вариант, так как им с помощью AdjustableArrowCaps. – Wish