- Katılım
- 21 Ocak 2024
- Mesajlar
- 164
- Tepkime puanı
- 36
- Puanları
- 28
Hesaplamalı Geometri, geometrik nesnelerin ve bunları işlemek için kullanılan algoritmaların incelenmesiyle ilgilenen bilgisayar bilimi ve matematiğin bir dalıdır. Geometrik problemlerin hesaplama teknikleri kullanılarak çözülmesini içerir ve bilgisayar grafikleri, bilgisayar destekli tasarım (CAD), robotik ve coğrafi bilgi sistemlerindeki (GIS) çeşitli uygulamalar için temel oluşturur.
Hesaplamalı Geometri Uygulamaları:
Bilgisayar Grafikleri: Şekil ve yüzeylerin oluşturulması ve manipüle edilmesi.
Bilgisayar Destekli Tasarım (CAD): Mekanik parçaların ve yapıların tasarlanması ve analiz edilmesi.
Robotik: Yol planlama ve hareket analizi.
Coğrafi Bilgi Sistemleri (CBS): Mekansal verileri ve coğrafi bilgileri analiz etme.
Örüntü Tanıma: Görüntü işlemede desen ve şekillerin tanımlanması.
Temel Geometrik Nesneler ve İşlemler
Noktalar, Çizgiler, Çizgi Parçaları ve Düzlemler:
Noktalar: Uzayda bir konumu temsil eden geometrinin temel birimleri.
Çizgiler: Her iki yönde sonsuza kadar uzanır ve iki nokta ile tanımlanır.
Doğru Parçaları: Bir doğrunun iki uç nokta tarafından tanımlanan kısmı.
Düzlemler: İki boyutta sonsuza kadar uzanan düz yüzeyler.
Vektörler ve Vektör İşlemleri:
Vektörler: Hem büyüklüğü hem de yönü olan nicelikleri temsil eder. Uzaydaki ötelemeleri ve yönleri tanımlamak için kullanılır.
Vektör İşlemleri: Toplama, çıkarma, nokta çarpımı, çapraz çarpım ve ölçeklendirmeyi içerir. Bu işlemler geometrik dönüşümleri ve hesaplamaları gerçekleştirmek için kullanılır.
Temel Geometrik Dönüşümler (Öteleme, Döndürme, Ölçekleme):
Öteleme: Geometrik bir nesnenin şeklini veya boyutunu değiştirmeden bir konumdan diğerine taşınması.
Döndürme: Bir nesnenin sabit bir nokta (veya orijin) etrafında belirli bir açı ile döndürülmesi.
Ölçekleme: Bir nesnenin şeklini koruyarak, büyütme veya küçültme yoluyla boyutunu değiştirme.
Uzaklık Ölçütleri ve Ölçüsü:
Öklid Mesafesi: Öklid uzayında iki nokta arasındaki düz çizgi mesafesi.
Manhattan Mesafesi: Dik açılı eksenler boyunca ölçülen iki nokta arasındaki mesafe.
Diğer Metrikler: Farklı geometrik ve uygulama bağlamlarında kullanılan Chebyshev uzaklığı ve Minkowski uzaklığını içerir.
Vektörler ve Vektör İşlemleri:
Hesaplamalı Geometri Algoritmalarına Örnekler
Hesaplamalı geometri, geometrik problemleri verimli bir şekilde çözmek için çeşitli algoritmalar içerir. Aşağıda böl ve yönet paradigması kullanılarak uygulanan yaygın algoritmalara örnekler verilmiştir:
En Yakın Nokta Çifti (1D)
1B'de, en yakın nokta çiftini bulmak böl ve yönet yaklaşımı kullanılarak verimli bir şekilde yapılabilir. Buradaki fikir, noktaları özyinelemeli olarak daha küçük gruplara ayırmak ve her gruptaki en yakın çifti bulmaktır.
Python Uygulaması:
En Yakın Nokta Çifti (2D)
2B'de en yakın nokta çifti problemi daha karmaşıktır. Noktaları sıralamayı ve bölünmüş bölümlerde en yakın çifti özyinelemeli olarak bulmayı, ardından bölünmüş sınır boyunca kontrol etmeyi içerir.
Python Uygulaması:
Graham Scan (Dışbükey Gövde)
Graham Scan, 2B'de bir dizi noktanın dışbükey gövdesini bulmak için kullanılan bir algoritmadır. Noktaları bir pivota göre kutupsal açıya göre sıralar ve ardından dışbükey gövdeyi oluşturur.
Python Uygulaması:
Jarvis March ( Gift Wrapping) (Convex Hull)
Jarvis March (Gift Wrapping) dışbükey gövdeyi bulmak için kullanılan başka bir algoritmadır. En soldaki noktadan başlar ve gövdeyi bulmak için noktaların etrafını sarar.
Python Uygulaması:
Hesaplamalı Geometri Uygulamaları:
Bilgisayar Grafikleri: Şekil ve yüzeylerin oluşturulması ve manipüle edilmesi.
Bilgisayar Destekli Tasarım (CAD): Mekanik parçaların ve yapıların tasarlanması ve analiz edilmesi.
Robotik: Yol planlama ve hareket analizi.
Coğrafi Bilgi Sistemleri (CBS): Mekansal verileri ve coğrafi bilgileri analiz etme.
Örüntü Tanıma: Görüntü işlemede desen ve şekillerin tanımlanması.
Temel Geometrik Nesneler ve İşlemler
Noktalar, Çizgiler, Çizgi Parçaları ve Düzlemler:
Noktalar: Uzayda bir konumu temsil eden geometrinin temel birimleri.
Çizgiler: Her iki yönde sonsuza kadar uzanır ve iki nokta ile tanımlanır.
Doğru Parçaları: Bir doğrunun iki uç nokta tarafından tanımlanan kısmı.
Düzlemler: İki boyutta sonsuza kadar uzanan düz yüzeyler.
Vektörler ve Vektör İşlemleri:
Vektörler: Hem büyüklüğü hem de yönü olan nicelikleri temsil eder. Uzaydaki ötelemeleri ve yönleri tanımlamak için kullanılır.
Vektör İşlemleri: Toplama, çıkarma, nokta çarpımı, çapraz çarpım ve ölçeklendirmeyi içerir. Bu işlemler geometrik dönüşümleri ve hesaplamaları gerçekleştirmek için kullanılır.
Temel Geometrik Dönüşümler (Öteleme, Döndürme, Ölçekleme):
Öteleme: Geometrik bir nesnenin şeklini veya boyutunu değiştirmeden bir konumdan diğerine taşınması.
Döndürme: Bir nesnenin sabit bir nokta (veya orijin) etrafında belirli bir açı ile döndürülmesi.
Ölçekleme: Bir nesnenin şeklini koruyarak, büyütme veya küçültme yoluyla boyutunu değiştirme.
Uzaklık Ölçütleri ve Ölçüsü:
Öklid Mesafesi: Öklid uzayında iki nokta arasındaki düz çizgi mesafesi.
Manhattan Mesafesi: Dik açılı eksenler boyunca ölçülen iki nokta arasındaki mesafe.
Diğer Metrikler: Farklı geometrik ve uygulama bağlamlarında kullanılan Chebyshev uzaklığı ve Minkowski uzaklığını içerir.
Vektörler ve Vektör İşlemleri:
Hesaplamalı Geometri Algoritmalarına Örnekler
Hesaplamalı geometri, geometrik problemleri verimli bir şekilde çözmek için çeşitli algoritmalar içerir. Aşağıda böl ve yönet paradigması kullanılarak uygulanan yaygın algoritmalara örnekler verilmiştir:
En Yakın Nokta Çifti (1D)
1B'de, en yakın nokta çiftini bulmak böl ve yönet yaklaşımı kullanılarak verimli bir şekilde yapılabilir. Buradaki fikir, noktaları özyinelemeli olarak daha küçük gruplara ayırmak ve her gruptaki en yakın çifti bulmaktır.
Python Uygulaması:
Python:
def closest_pair_1d(points):
def find_closest_pair(sorted_points):
# Base case: If there are only two points, return them
if len(sorted_points) == 2:
return sorted_points[0], sorted_points[1]
# Base case: If there are three points, return the closest pair
if len(sorted_points) == 3:
return min(
((sorted_points[0], sorted_points[1]),
(sorted_points[1], sorted_points[2]),
(sorted_points[0], sorted_points[2])),
key=lambda pair: abs(pair[1] - pair[0])
)
# Divide the points into two halves
mid = len(sorted_points) // 2
left_half = sorted_points[:mid]
right_half = sorted_points[mid:]
# Find the closest pair in each half
closest_pair_left = find_closest_pair(left_half)
closest_pair_right = find_closest_pair(right_half)
# Find the closest pair across the split
closest_pair_split = (left_half[-1], right_half[0])
# Return the overall closest pair
return min(closest_pair_left, closest_pair_right, closest_pair_split, key=lambda pair: abs(pair[1] - pair[0]))
if len(points) < 2:
raise ValueError("At least two points are required")
# Sort the points
sorted_points = sorted(points)
# Find the closest pair using divide and conquer
return find_closest_pair(sorted_points)
# Example usage
points = [0, 1, 3, 5, 7, 9, 11]
closest_points = closest_pair_1d(points)
print(f"The closest pair of points is: {closest_points}")
En Yakın Nokta Çifti (2D)
2B'de en yakın nokta çifti problemi daha karmaşıktır. Noktaları sıralamayı ve bölünmüş bölümlerde en yakın çifti özyinelemeli olarak bulmayı, ardından bölünmüş sınır boyunca kontrol etmeyi içerir.
Python Uygulaması:
Python:
import math
def distance(point1, point2):
return math.sqrt((point1[0] - point2[0]) ** 2 + (point1[1] - point2[1]) ** 2)
def closest_pair_2d(points):
def closest_pair_recursive(points_sorted_by_x, points_sorted_by_y):
n = len(points_sorted_by_x)
if n <= 3:
return brute_force_closest_pair(points_sorted_by_x)
mid = n // 2
left_half_x = points_sorted_by_x[:mid]
right_half_x = points_sorted_by_x[mid:]
midpoint = points_sorted_by_x[mid][0]
left_half_y = list(filter(lambda x: x[0] <= midpoint, points_sorted_by_y))
right_half_y = list(filter(lambda x: x[0] > midpoint, points_sorted_by_y))
(p1, q1, d1) = closest_pair_recursive(left_half_x, left_half_y)
(p2, q2, d2) = closest_pair_recursive(right_half_x, right_half_y)
if d1 < d2:
d = d1
min_pair = (p1, q1)
else:
d = d2
min_pair = (p2, q2)
(p3, q3, d3) = closest_split_pair(points_sorted_by_x, points_sorted_by_y, d, min_pair)
if d3 < d:
return (p3, q3, d3)
else:
return min_pair[0], min_pair[1], d
def brute_force_closest_pair(points):
min_dist = float('inf')
p1 = None
p2 = None
for i in range(len(points)):
for j in range(i + 1, len(points)):
d = distance(points[i], points[j])
if d < min_dist:
min_dist = d
p1, p2 = points[i], points[j]
return p1, p2, min_dist
def closest_split_pair(points_sorted_by_x, points_sorted_by_y, delta, best_pair):
n = len(points_sorted_by_x)
mid_x = points_sorted_by_x[n // 2][0]
Sy = [point for point in points_sorted_by_y if mid_x - delta <= point[0] <= mid_x + delta]
best = delta
len_Sy = len(Sy)
for i in range(len_Sy - 1):
for j in range(i + 1, min(i + 7, len_Sy)):
p, q = Sy[i], Sy[j]
dst = distance(p, q)
if dst < best:
best = dst
best_pair = (p, q)
return best_pair[0], best_pair[1], best
points_sorted_by_x = sorted(points, key=lambda x: x[0])
points_sorted_by_y = sorted(points, key=lambda x: x[1])
p1, p2, min_dist = closest_pair_recursive(points_sorted_by_x, points_sorted_by_y)
return p1, p2, min_dist
# Example usage
points = [(2, 3), (2, 4), (12, 30), (40, 50), (5, 1), (12, 10), (3, 4)]
closest_points = closest_pair_2d(points)
print(f"The closest pair of points is: {closest_points[0]} and {closest_points[1]} with a distance of {closest_points[2]}")
Graham Scan (Dışbükey Gövde)
Graham Scan, 2B'de bir dizi noktanın dışbükey gövdesini bulmak için kullanılan bir algoritmadır. Noktaları bir pivota göre kutupsal açıya göre sıralar ve ardından dışbükey gövdeyi oluşturur.
Python Uygulaması:
Python:
import math
def graham_scan(points):
# Find the point with the lowest y-coordinate, break ties by x-coordinate
pivot = min(points, key=lambda p: (p[1], p[0]))
points.remove(pivot)
# Sort the points based on polar angle with the pivot
points.sort(key=lambda p: (math.atan2(p[1] - pivot[1], p[0] - pivot[0]), p[1], p[0]))
# Add the pivot back to the beginning
points.insert(0, pivot)
# Initialize the hull with the first two points
hull = [points[0], points[1]]
for p in points[2:]:
while len(hull) > 1 and orientation(hull[-2], hull[-1], p) != 2:
hull.pop()
hull.append(p)
return hull
def orientation(p, q, r):
# Function to find the orientation of the triplet (p, q, r)
# 0 -> p, q, and r are collinear
# 1 -> Clockwise
# 2 -> Counterclockwise
val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])
if val == 0:
return 0
elif val > 0:
return 1
else:
return 2
# Sample points
points = [(0, 0), (1, 1), (2, 2), (2, 0), (0, 2), (0.5, 2.5), (2.5, 2)]
# Call the function
convex_hull = graham_scan(points)
# Print the result
print("Convex Hull:", convex_hull)
Jarvis March ( Gift Wrapping) (Convex Hull)
Jarvis March (Gift Wrapping) dışbükey gövdeyi bulmak için kullanılan başka bir algoritmadır. En soldaki noktadan başlar ve gövdeyi bulmak için noktaların etrafını sarar.
Python Uygulaması:
Python:
def gift_wrapping(points):
hull = []
start = min(points, key=lambda p: p[0]) # Find the leftmost point
on_hull = start
while True:
hull.append(on_hull)
next_point = points[0]
for p in points:
if (next_point == on_hull) or (orientation(on_hull, next_point, p) == 2):
next_point = p
on_hull = next_point
if on_hull == start:
break
return hull
def orientation(p, q, r):
# Function to find the orientation of the triplet (p, q, r)
# 0 -> p
, q, and r are collinear
# 1 -> Clockwise
# 2 -> Counterclockwise
val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1])
if val == 0:
return 0
elif val > 0:
return 1
else:
return 2
# Sample points
points = [(0, 0), (1, 1), (2, 2), (2, 0), (0, 2), (0.5, 2.5), (2.5, 2)]
# Call the function
convex_hull = gift_wrapping(points)
# Print the result
print("Convex Hull:", convex_hull)