Python ile üçgen çizdirme

TheErdem

Hectopat
Katılım
6 Kasım 2020
Mesajlar
346
Çözümler
3
Daha fazla  
Cinsiyet
Erkek
Merhaba, Python kullanarak bir program yapmaya çalışıyorum. Bir koordinat sistemi düşünün. Bu koordinat sisteminde X ve Y 0'ı üçgenin bir köşesi olacak şekilde alarak sırasıyla üst üste üçgenler çizdireceğim. Mesela ilk üçgenin kenar uzunlukları 3-5-7, ikincisinin 5-7-11 gibi. Bunu Python'da nasıl yapabilirim? İlk olarak OpenCV kullanmayı düşündüm ama Matplotlib'de mantıklı geldi. Belkide hiç bilmediğim bir şey vardır pythona yeni başladım şu ana kadar bütün çalışmalarımı C# ile yapıyordum, şu an Python öğrenmeye çalışıyorum. Yardımcı olursanız çok sevinirim.
 

Dosya Ekleri

  • 1739626930873.png
    1739626930873.png
    16,5 KB · Görüntüleme: 33
Python:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QLineEdit, QComboBox, QHBoxLayout
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

class TrianglePlot(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.triangle_list = []
    
    def initUI(self):
        layout = QVBoxLayout()
        input_layout = QHBoxLayout()
        
        self.base_input = QLineEdit()
        self.base_input.setPlaceholderText("Taban Uzunluğu")
        input_layout.addWidget(QLabel("Taban:"))
        input_layout.addWidget(self.base_input)
        
        self.left_input = QLineEdit()
        self.left_input.setPlaceholderText("Sol Kenar Uzunluğu")
        input_layout.addWidget(QLabel("Sol Kenar:"))
        input_layout.addWidget(self.left_input)
        
        self.right_input = QLineEdit()
        self.right_input.setPlaceholderText("Sağ Kenar Uzunluğu")
        input_layout.addWidget(QLabel("Sağ Kenar:"))
        input_layout.addWidget(self.right_input)
        
        self.color_input = QComboBox()
        self.color_input.addItems(["red", "orange", "yellow", "green", "blue", "purple", "black"])
        input_layout.addWidget(QLabel("Renk:"))
        input_layout.addWidget(self.color_input)
        
        layout.addLayout(input_layout)
        
        self.canvas = FigureCanvas(plt.figure(figsize=(8, 8)))
        layout.addWidget(self.canvas)
        
        self.button = QPushButton("Üçgen Ekle")
        self.button.clicked.connect(self.add_triangle)
        layout.addWidget(self.button)
        
        self.clear_button = QPushButton("Temizle")
        self.clear_button.clicked.connect(self.clear_triangles)
        layout.addWidget(self.clear_button)
        
        self.setLayout(layout)
    
    def add_triangle(self):
        base = float(self.base_input.text())
        left = float(self.left_input.text())
        right = float(self.right_input.text())
        color = self.color_input.currentText()
        
        A = (0, 0)
        B = (base, 0)
        cos_angle = (left**2 + base**2 - right**2) / (2 * left * base)
        angle = np.arccos(cos_angle)
        C_x = left * np.cos(angle)
        C_y = left * np.sin(angle)
        C = (C_x, C_y)
        
        self.triangle_list.append((A, B, C, color))
        self.draw_triangles()
    
    def draw_triangles(self):
        self.canvas.figure.clear()
        ax = self.canvas.figure.add_subplot(111)
        ax.axhline(0, color='black', linewidth=2)
        ax.axvline(0, color='black', linewidth=2)
        
        max_x = 0
        max_y = 0
        
        for A, B, C, color in self.triangle_list:
            ax.plot([A[0], B[0]], [A[1], B[1]], marker='o', color=color, linewidth=2)
            ax.plot([B[0], C[0]], [B[1], C[1]], marker='o', color=color, linewidth=2)
            ax.plot([C[0], A[0]], [C[1], A[1]], marker='o', color=color, linewidth=2)
            ax.text(A[0], A[1], f'({A[0]:.2f}, {A[1]:.2f})', fontsize=8, color=color)
            ax.text(B[0], B[1], f'({B[0]:.2f}, {B[1]:.2f})', fontsize=8, color=color)
            ax.text(C[0], C[1], f'({C[0]:.2f}, {C[1]:.2f})', fontsize=8, color=color)
            max_x = max(max_x, A[0], B[0], C[0])
            max_y = max(max_y, A[1], B[1], C[1])
        
        ax.set_xlim(0, max_x + 5)
        ax.set_ylim(0, max_y + 5)
        ax.set_aspect('equal')
        self.canvas.draw()
    
    def clear_triangles(self):
        self.triangle_list = []
        self.draw_triangles()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Dinamik Üçgen Çizici")
        self.setGeometry(100, 100, 900, 900)
        self.trianglePlot = TrianglePlot()
        self.setCentralWidget(self.trianglePlot)

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

Matplotlib daha mantikli
 
Hocam peki bu attığınız kodları bir yapay zekaya mı yazdırdınız? Yazdırdıysanız hangisi acaba öğrenebilir miyim? Birde anlamadığım şey şu, bu koordinat sistemi neden sadece 1. bölgeden oluşuyor, bunun bir çözümü yok mu? Çünkü bu sebepten üçgenleri tam olarak gösteremiyor.
1739629686437.png

@Traveller08
 
Hocam peki bu attığınız kodları bir yapay zekaya mı yazdırdınız? Yazdırdıysanız hangisi acaba öğrenebilir miyim? Birde anlamadığım şey şu, bu koordinat sistemi neden sadece 1. bölgeden oluşuyor, bunun bir çözümü yok mu? Çünkü bu sebepten üçgenleri tam olarak gösteremiyor. Eki Görüntüle 2424508
@Traveller08
Hocam gpt 4 e yazdırdım biraz da prompt alimligimi kullanarak. 1. bölge olsun dedim ama haklısınız cortlamış yeni versiyonunu atıyorum
Kod:
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QVBoxLayout, QWidget, QLabel, QLineEdit, QComboBox, QHBoxLayout, QTextEdit
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas

class TrianglePlot(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.triangle_list = []
    
    def initUI(self):
        layout = QVBoxLayout()
        input_layout = QHBoxLayout()
        
        self.base_input = QLineEdit()
        self.base_input.setPlaceholderText("Taban Uzunluğu")
        input_layout.addWidget(QLabel("Taban:"))
        input_layout.addWidget(self.base_input)
        
        self.left_input = QLineEdit()
        self.left_input.setPlaceholderText("Sol Kenar Uzunluğu")
        input_layout.addWidget(QLabel("Sol Kenar:"))
        input_layout.addWidget(self.left_input)
        
        self.right_input = QLineEdit()
        self.right_input.setPlaceholderText("Sağ Kenar Uzunluğu")
        input_layout.addWidget(QLabel("Sağ Kenar:"))
        input_layout.addWidget(self.right_input)
        
        self.color_input = QComboBox()
        self.color_input.addItems(["red", "orange", "yellow", "green", "blue", "purple", "black"])
        input_layout.addWidget(QLabel("Renk:"))
        input_layout.addWidget(self.color_input)
        
        layout.addLayout(input_layout)
        
        self.canvas = FigureCanvas(plt.figure(figsize=(8, 8)))
        layout.addWidget(self.canvas)
        
        self.button = QPushButton("Üçgen Ekle")
        self.button.clicked.connect(self.add_triangle)
        layout.addWidget(self.button)
        
        self.clear_button = QPushButton("Temizle")
        self.clear_button.clicked.connect(self.clear_triangles)
        layout.addWidget(self.clear_button)
        
        self.angle_text = QTextEdit()
        self.angle_text.setReadOnly(True)
        layout.addWidget(QLabel("Üçgen Açılarının Trigonometrik Fonksiyonları:"))
        layout.addWidget(self.angle_text)
        
        self.setLayout(layout)
    
    def add_triangle(self):
        base = float(self.base_input.text())
        left = float(self.left_input.text())
        right = float(self.right_input.text())
        color = self.color_input.currentText()
        
        A = (0, 0)
        B = (base, 0)
        cos_C = (left**2 + right**2 - base**2) / (2 * left * right)
        angle_C = np.degrees(np.arccos(cos_C))
        C_x = right * np.cos(np.radians(angle_C))
        C_y = right * np.sin(np.radians(angle_C))
        C = (C_x, C_y)
        
        cos_A = (base**2 + right**2 - left**2) / (2 * base * right)
        angle_A = np.degrees(np.arccos(cos_A))
        
        cos_B = (base**2 + left**2 - right**2) / (2 * base * left)
        angle_B = np.degrees(np.arccos(cos_B))
        
        self.triangle_list.append((A, B, C, color, angle_A, angle_B, angle_C))
        self.draw_triangles()
    
    def draw_triangles(self):
        self.canvas.figure.clear()
        ax = self.canvas.figure.add_subplot(111)
        ax.axhline(0, color='black', linewidth=2)
        ax.axvline(0, color='black', linewidth=2)
        
        max_x = 0
        min_x = 0
        max_y = 0
        min_y = 0
        
        self.angle_text.clear()
        
        for A, B, C, color, angle_A, angle_B, angle_C in self.triangle_list:
            ax.plot([A[0], B[0]], [A[1], B[1]], marker='o', color=color, linewidth=2)
            ax.plot([B[0], C[0]], [B[1], C[1]], marker='o', color=color, linewidth=2)
            ax.plot([C[0], A[0]], [C[1], A[1]], marker='o', color=color, linewidth=2)
            ax.text(A[0], A[1], f'({A[0]:.2f}, {A[1]:.2f})', fontsize=8, color=color)
            ax.text(B[0], B[1], f'({B[0]:.2f}, {B[1]:.2f})', fontsize=8, color=color)
            ax.text(C[0], C[1], f'({C[0]:.2f}, {C[1]:.2f})', fontsize=8, color=color)
            max_x = max(max_x, A[0], B[0], C[0])
            min_x = min(min_x, A[0], B[0], C[0])
            max_y = max(max_y, A[1], B[1], C[1])
            min_y = min(min_y, A[1], B[1], C[1])
            self.angle_text.append(f'Üçgen Açılar: A: {angle_A:.2f}°, B: {angle_B:.2f}°, C: {angle_C:.2f}°')
            self.angle_text.append(f'Sinüs: sin(A)={np.sin(np.radians(angle_A)):.2f}, sin(B)={np.sin(np.radians(angle_B)):.2f}, sin(C)={np.sin(np.radians(angle_C)):.2f}')
            self.angle_text.append(f'Kosinüs: cos(A)={np.cos(np.radians(angle_A)):.2f}, cos(B)={np.cos(np.radians(angle_B)):.2f}, cos(C)={np.cos(np.radians(angle_C)):.2f}')
            self.angle_text.append("---------------------------")
        
        ax.set_xlim(min_x - 5, max_x + 5)
        ax.set_ylim(min_y - 5, max_y + 5)
        ax.set_aspect('equal')
        self.canvas.draw()
    
    def clear_triangles(self):
        self.triangle_list = []
        self.draw_triangles()

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Dinamik Üçgen Çizici")
        self.setGeometry(100, 100, 900, 900)
        self.trianglePlot = TrianglePlot()
        self.setCentralWidget(self.trianglePlot)

if __name__ == '__main__':
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

trigonometrik değerlerini de gösteriyor
 
Hocam gerçekten çok yardımcı oldunuz, yapacağım program için bana iyi bir fikir oluşturdu. Başka bir sorum olursa yazacağım. Çok teşekkür ederim.
 

Technopat Haberler

Yeni konular

Geri
Yukarı