-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLineSegment.py
50 lines (41 loc) · 1.71 KB
/
LineSegment.py
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
from dataclasses import dataclass
from Constant import eps
from Site import Site
@dataclass
class LineSegment:
"""
Merepresentasikan sebuah segmen garis antara dua titik dalam ruang 2D.
Attributes:
a: Titik ujung pertama dari segmen garis
b: Titik ujung kedua dari segmen garis
"""
a: Site
b: Site
def contains_point(self, point: Site) -> bool:
"""
Memeriksa apakah suatu titik terletak pada segmen garis.
Method ini menggunakan pendekatan berikut:
1. Untuk garis vertikal, periksa apakah x koordinat titik sama dengan x garis
dan y koordinat berada di antara kedua ujung garis
2. Untuk garis lainnya, hitung gradien (k) dan intersep-y (c),
kemudian periksa apakah titik memenuhi persamaan garis y = kx + c
Args:
point: Titik yang akan diperiksa
Returns:
True jika titik terletak pada segmen garis, False jika tidak
Note:
Menggunakan nilai epsilon (eps) untuk perbandingan floating-point
untuk mengatasi masalah presisi numerik
"""
# Kasus khusus untuk garis vertikal
if abs(self.b.x - self.a.x) < eps:
return (
abs(point.x - self.a.x) < eps # x koordinat sama
and point.y >= min(self.a.y, self.b.y) # y di antara kedua ujung
and point.y <= max(self.a.y, self.b.y)
)
# Hitung gradien dan intersep-y
k = (self.b.y - self.a.y) / (self.b.x - self.a.x)
c = self.a.y - k * self.a.x
# Periksa apakah titik terletak pada garis
return abs(point.y - (point.x * k + c)) < eps