Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.121.114] |
|
Сообщ.
#1
,
|
|
|
Имеется окружность, заданная 3-мя точками.
данная окружность отсекается прямой, прямая задана 2-мя точками. Нужно нарисовать контур, чтобы он включал часть контура окружности, что слева от прямой и соответственно прямую. как мне олгоритмически решить эту задачу? окружность по 3-м точкам построить и нарисовать не проблема, прямую по 2-м точкам тоже, но вот как весь этот контур посчитать - это не понимаю. в какую сторону смотреть? кто что подскажет? идеи у меня конечно же есть, но они какие то не "красивые". |
Сообщ.
#2
,
|
|
|
Не очень понятно, как все-таки будет выглядеть контур.
А что именно нужно посчитать - пересечение прямой и окружности? |
Сообщ.
#3
,
|
|
|
значит есть контур оркужности, он задан 3-мя координатами.
Это я могу посчитать и отрисовать. теперь известно, что данная окружность отсекается прямой, эта прямая задана 2-мя точками. теперь мне нужно отрисовать окружность, но с одной стороны пиксели этого круглого контура будут отсечены линией. ххх/----\х| хх/хххххх\| х/хххххххх| |ххххххххх| |ххххххххх| х\хххххххх| хх\хххххх/| ххх\____/х| я сделал просто if (IsPointInLineCut(CirclePos.X,CirclePos.Y)) // просто проверяю пиксель окружности на принадлежность линии или плоскости за линией { CirclePos.X = GetLinePos(CirclePos.Y); // тогда позиция по Х для окружности считается от имеющихся данных прямой по уравнению прямой. } но это как то просто... может есть что красивее. решение через уравнения и т.д. Но может я уже перегрелся и мне пора идти отдыхать... |
Сообщ.
#4
,
|
|
|
система из двух уравнений (способы описания прямой могут быть разными)
находим решение - 0, 1 или 2 точки пересечения. Ax+By+C=0 (X-CX)^2 + (Y-CY)^2=R^2 Нужно отрисовать часть окружности - дугу, или часть круга - сегмент? Для обоих случаев в Windows GDI, например, есть граф. примитивы - Arc и Chord |
Сообщ.
#5
,
|
|
|
нужно отрисовать сектор контура: дуга + отсекающая прямая.
|
Сообщ.
#6
,
|
|
|
procedure TForm2.Button22Click(Sender: TObject); var X0, Y0, X1, Y1: Integer; CX, CY, R: Integer; DirX, DirY, DiffX, DiffY, Len, DiffLenSqr, Det, ScalarProd, Fi: Double; PX0, PX1, PY0, PY1: Integer; begin Randomize; X0 := 0; Y0 := 0; Fi := Random * Pi/2; X1 := Round(500 * Cos(Fi)); Y1 := Round(500 * Sin(Fi)); CX := 20 + Random(250); CY := 20 + Random(250); R := 30 + Random(120); Canvas.Brush.Style := bsSolid; Canvas.Pen.Color := clBlack; Canvas.FillRect(ClientRect); Canvas.Brush.Style := bsClear; Canvas.MoveTo(X0, Y0); Canvas.LineTo(X1, Y1); Canvas.Ellipse(CX - R, CY - R, CX + R + 1, CY + R + 1); Canvas.Pen.Color := clBlue; Len := Hypot(X1-X0, Y1-Y0); DirX := (X1-X0)/Len; DirY := (Y1-Y0)/Len; DiffX := X0 - CX; DiffY := Y0 - CY; DiffLenSqr := Sqr(DiffX) + Sqr(DiffY); ScalarProd := DirX * DiffX + DirY * DiffY; Det := Sqr(ScalarProd) - DiffLenSqr + Sqr(R); if Det > 0 then begin // 2 общие точки Det := Sqrt(Det); PX0 := Round(X0 + (-ScalarProd - Det) * DirX); PX1 := Round(X0 + (-ScalarProd + Det) * DirX); PY0 := Round(Y0 + (-ScalarProd - Det) * DirY); PY1 := Round(Y0 + (-ScalarProd + Det) * DirY); //точки пересечения Canvas.Chord(CX - R, CY - R, CX + R + 1, CY + R + 1, PX0, PY0, PX1, PY1); end; end; Прикреплённая картинка
|
Сообщ.
#7
,
|
|
|
ого. спасибо.
|