Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Alvin Seville
 Аватар для Соколиный глаз
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 22

Пересечение прямых

17.02.2018, 16:28. Показов 917. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Опять же, есть тот самый код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
uses System;
const
  Eps = 1E-5; // Погрешность
 
type
  TPoint = class(ICloneable, IEquatable<TPoint>)
  private 
    _X, _Y: real;
  
  public 
    property X: real read _X write _X; // X координата точки
    property Y: real read _Y write _Y; // Y координата точки
    
    constructor(x_, y_: real);
    begin
      X := x_;Y := y_;
    end;
    
    function DistanceTo(p: TPoint) := Sqrt(Sqr(p.X - _X) + Sqr(p.Y - _Y)); // Возвращает дистанцию от данной точки до точки p.
    
    function GetRadiusVectorLength() := Sqrt(Sqr(_X) + Sqr(_Y)); // Получает длину радиус вектора, задаваемого координатами данной точки.
    
    function Clone(): object := new TPoint(_X, _Y);
    
    function CloneAs() := TPoint(Clone());
    
    function Equals(p: TPoint) := (Abs(_X - p.X) < Eps) and (Abs(_Y - p.Y) < Eps);
    
    class function Readln() := new TPoint(ReadlnReal('X:'), ReadlnReal('Y:')); // Выполняет чтение точки с клавиатуры и возвращает новую точку.
    
    class function operator=(a, b: TPoint) := a.Equals(b);
    
    class function operator<>(a, b: TPoint) := not (a = b);
    
    function ToString() := Format('Point({0}, {1})', _X, _Y); // Возвращает строковое представление объекта.
    
    procedure Print() := Write(ToString());
    
    procedure Println() := Writeln(ToString());
  end;
 
type
  TLine = class(ICloneable, IEquatable<TLine>)
  private 
    _A, _B: TPoint;
    
    function GetCoefficientA() := _B.Y - _A.Y;
    
    function GetCoefficientB() := _B.X - _A.X;
    
    function GetCoefficientC() := -GetCoefficientA()*_A.X + GetCoefficientB()*_A.Y;
    
    function GetIsHorizontal() := GetCoefficientA() = 0;
    
    function GetIsVertical() := GetCoefficientB() = 0;
    
    function GetCoefficientK() := -GetCoefficientA() / GetCoefficientB();
    
  public 
    property A: TPoint read _A write _A;
    property B: TPoint read _B write _B;
    property IsHorizontal: boolean read GetIsHorizontal;
    property IsVertical: boolean read GetIsVertical;
    property CoefficientA: real read GetCoefficientA; // Коэффициент A в общем уравнении прямой
    property CoefficientB: real read GetCoefficientB; // Коэффициент B в общем уравнении прямой
    property CoefficientC: real read GetCoefficientC; // Коэффициент C в общем уравнении прямой
    property CoefficientK: real read GetCoefficientK; // K в уравнении прямой с угловым коэффициентом
    
    constructor(pA, pB: TPoint);
    begin
      A := pA;B := pB;
    end;
    
    function GetB() := -GetCoefficientC() / GetCoefficientB(); // Возвращает b в уравнении прямой с угловым коэффициентом
    
    function ToCanonicalEquation() := Format('Line[(x - {0}) / {1} = (y - {2}) / {3}]', _A.X, GetCoefficientB(), _A.Y, GetCoefficientA());
    
    function ToParametricEquation() := Format('Line[x = {0} + {1}a, y = {2} + {3}a]', _A.X, GetCoefficientB(), _A.Y, GetCoefficientA());
    
    function ToGeneralEquation() := Format('Line[{0}x + {1}y - {2} = 0]', GetCoefficientA(), GetCoefficientB(), GetCoefficientC());
    
    function ToEquationWithAngularCoefficient(): string;
    begin
      var quotient := GetCoefficientA() / GetCoefficientB();
      Result := Format('Line[{0}x + {1}]', quotient, -_A.X * quotient + A.Y);
    end;
    
    // Возвращает true, если прямые совпадают.
    function MatchesTo(l: TLine) := (GetCoefficientK() = l.CoefficientK) and (GetB() = l.GetB());
    
    // Возвращает true, если прямые параллельны.
    function ParallelTo(l: TLine) := (GetCoefficientK() = l.CoefficientK) and (GetB() <> l.GetB());
    
    // Возвращает true, если прямые пересекаются.
    function IntersectWith(l: TLine) := GetCoefficientK() <> l.CoefficientK;
    
    function GetIntersectionPoint(l: TLine): TPoint;
    begin
      if not IntersectWith(l) then
        raise new InvalidOperationException('Нет точки пересечения прямых.');
      var y := (GetCoefficientA() * l.CoefficientC - l.CoefficientA * GetCoefficientC()) / (l.CoefficientA * GetCoefficientB() - GetCoefficientA() * l.CoefficientB);
      Result := new TPoint(y, (-GetCoefficientB() * y - GetCoefficientC()) / GetCoefficientA());
    end;
    
    function Clone(): object := new TLine(_A.CloneAs(), _B.CloneAs());
    
    function CloneAs() := TLine(Clone());
    
    function Equals(l: TLine) := _A.Equals(l.A) and _B.Equals(l.B);
    
    class function Readln() := new TLine(TPoint.Readln(), TPoint.Readln());
    
    class function operator=(l1, l2: TLine) := l1.Equals(l2);
    
    class function operator<>(l1, l2: TLine) := not (l1 = l2);
    
    function ToString() := Format('Line({0}, {1})', _A.ToString(), _B.ToString());
    
    procedure Print() := Write(ToString());
    
    procedure Println() := Writeln(ToString());
  end;
 
function ToCoordsTuple(self: TLine): (real, real, real, real); extensionmethod;
begin
  Result := (self.A.X, self.A.Y, self.B.X, self.B.Y);
end;
 
begin
  var (L1, L2) := (new TLine(new TPoint(0, 0), new TPoint(1, 1)),
                   new TLine(new TPoint(0, 0), new TPoint(-1, 1)));
  L1.GetIntersectionPoint(L2).Println();
end.
Я составил систему уравнений, составленную из общих уравнений двух прямых и выразил из нее y и x. Но: для нахождения их используется деление. Например, если брать векторы орты i и j, то будет NaN у y (что никак не лучше). Так вот вопрос такой: как решить эту проблему? Использовать иные уравнения прямой?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.02.2018, 16:28
Ответы с готовыми решениями:

Определение параллельности прямых
uses System; const Eps = 1E-5; // Погрешность type TPoint = class(ICloneable,...

Преобразование множества прямых линий
Народ помогите с кодом я не очень понял. Вот задание : Множество прямых М задано коэффициентами...

Вычислить расстояния от заданных прямых до оси Y
Условие а) Сформировать P - подмножество M, включающее в себя только прямые, параллельные оси...

1
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
19.02.2018, 08:23
Первый отсев: координаты концов отрезков по каждой из осей (числовой прямой).

Если max(x11,x12,x21,x23)-min(x11,x12,x21,x23) > max(x11,x12)-min(x11,x12) + max(x21,x22)-min(x21,x22), то нет пересечения. Аналогично по y…

Второй отсев: если две прямые || или совпадают.

d=(x11-x12)·(y21-y22)-(y11-y12)·(x21-x22)
Если d = 0, то значит параллельность прямых и частичное или полное совпадение доказано.

Если стоит задача типа как вот здесь Уборка,
то параллельность будет говорить, что палочки можно убрать.
А иначе нужно будет проверить ещё и на совпадение, т.е. принадлежность точки отрезку.
(Типа как 43 строка нижеприведённого кода ;–)

И только после этого: нахождение точки пересечения и анализ.

Px = [ (x11·y12-y11·x12)·(x21-x22) - (x11-x12)·(x21·y22-y21·x22) ] : d
Py = [ (x11·y12-y11·x12)·(y21-y22) - (y11-y12)·(x21·y22-y21·x22) ] : d

Для вышеуказанной темы можно будет использовать вот такое решение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
uses System;
const
  eps = 1e-5;
 
type
  tPoint = class
    x, y : Real;
 
    constructor(x, y : Real);
    begin
      Self.x := x; Self.y := y;
    end;
    
  end;
 
type
  tSegment = class
    a, b : tPoint;
    
    constructor(x1, y1, x2, y2 : Real);
    begin
      a := New tPoint(x1, y1); b := New tPoint(x2, y2);
    end;
    
    function Intersections(s : tSegment) : Boolean;
    begin
      Result := False;
 
      if ( (max(max(a.x,b.x),max(s.a.x,s.b.x))-min(min(a.x,b.x),min(s.a.x,s.a.x))) -
      (max(a.x,b.x)-min(a.x,b.x)+max(s.a.x,s.b.x)-min(s.a.x,s.b.x)) ) > eps then Exit;
      
      if ( (max(max(a.y,b.y),max(s.a.y,s.b.y))-min(min(a.y,b.y),min(s.a.y,s.a.y))) -
      (max(a.y,b.y)-min(a.y,b.y)+max(s.a.y,s.b.y)-min(s.a.y,s.b.y)) ) > eps then Exit;
      
      Result := True;
      
      var d := (a.x-b.x)*(s.a.y-s.b.y) - (a.y-b.y)*(s.a.x-s.b.x);
      if d = 0 then Exit;
      
      var px := ((a.x*b.y - a.y*b.x)*(s.a.x - s.b.x) - (a.x - b.x)*(s.a.x*s.b.y - s.a.y*s.b.x)) / d;
      var py := ((a.x*b.y - a.y*b.x)*(s.a.y - s.b.y) - (a.y - b.y)*(s.a.x*s.b.y - s.a.y*s.b.x)) / d;
      
      Result := abs((max(a.x,b.x)-px) + (px-min(a.x,b.x)) - (max(a.x,b.x)-min(a.x,b.x))) < eps;
    end;
  end;
 
begin
  var(s1,s2,s3,s4) := (New tSegment(0,4,4,4), New tSegment(5,4,6,4),
                       New tSegment(1,4,-3,4), New tSegment(3,3,5,5));
  WriteLn(s1.Intersections(s2));
  WriteLn(s1.Intersections(s3));
  WriteLn(s1.Intersections(s4));
end.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.02.2018, 08:23
Помогаю со студенческими работами здесь

Пересечение прямых
Даны 2 прямые:y=a1*x+b1 и y=a2*x+b2.найти их точку пересечения,если a1,a2,b1,b2 вводятся с...

Ветвление. Даны уравнения прямых. Выяснить, какие из этих прямых параллельны
Написать программу: Даны уравнения прямых а1х+b1y=c1, a2x+b2y=c2, a3x+b3y=c3. Выяснить, какие из...

Задача о прямых и их сечениях
Вчера дали выполнить следующую задачу. Вот условие: Я почему-то не могу понять как решить...

Определить взаимное расположение прямых
Пользователь вводит коэффициенты двух уравнений задающих прямые. ( Уравнения могут быть в общем...

Преобразование множества прямых линий
Народ горю, очень нужна помощь программистов, очень нужно решить эту задачу, знаю что у вас и так...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru