На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> отсечение замкнутого контура прямой , отсечение замкнутого контура прямой
    Имеется окружность, заданная 3-мя точками.
    данная окружность отсекается прямой, прямая задана 2-мя точками.
    Нужно нарисовать контур, чтобы он включал часть контура окружности, что слева от прямой и соответственно прямую.

    как мне олгоритмически решить эту задачу?
    окружность по 3-м точкам построить и нарисовать не проблема, прямую по 2-м точкам тоже,
    но вот как весь этот контур посчитать - это не понимаю.

    в какую сторону смотреть? кто что подскажет?

    идеи у меня конечно же есть, но они какие то не "красивые".
      Не очень понятно, как все-таки будет выглядеть контур.
      А что именно нужно посчитать - пересечение прямой и окружности?
        значит есть контур оркужности, он задан 3-мя координатами.
        Это я могу посчитать и отрисовать.
        теперь известно, что данная окружность отсекается прямой, эта прямая задана 2-мя точками.
        теперь мне нужно отрисовать окружность, но с одной стороны пиксели этого круглого контура будут отсечены линией.

        ххх/----\х|
        хх/хххххх\|
        х/хххххххх|
        |ххххххххх|
        |ххххххххх|
        х\хххххххх|
        хх\хххххх/|
        ххх\____/х|

        я сделал просто
        if (IsPointInLineCut(CirclePos.X,CirclePos.Y)) // просто проверяю пиксель окружности на принадлежность линии или плоскости за линией
        {
        CirclePos.X = GetLinePos(CirclePos.Y); // тогда позиция по Х для окружности считается от имеющихся данных прямой по уравнению прямой.
        }

        но это как то просто... может есть что красивее. решение через уравнения и т.д.
        Но может я уже перегрелся и мне пора идти отдыхать...
        Сообщение отредактировано: Rompas -
          система из двух уравнений (способы описания прямой могут быть разными)
          находим решение - 0, 1 или 2 точки пересечения.
          Ax+By+C=0
          (X-CX)^2 + (Y-CY)^2=R^2

          Нужно отрисовать часть окружности - дугу, или часть круга - сегмент?
          Для обоих случаев в Windows GDI, например, есть граф. примитивы - Arc и Chord
            нужно отрисовать сектор контура: дуга + отсекающая прямая.
              ExpandedWrap disabled
                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;
              Сообщение отредактировано: MBo -

              Прикреплённая картинка
              Прикреплённая картинка
                ого. спасибо.
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0796 ]   [ 15 queries used ]   [ Generated: 21.05.24, 07:16 GMT ]