Spinnennetz über ein Rechteck Linienlängen problem

Fragen zu Tkinter.
Antworten
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

Bild

So hier das ausgangsfoto wie man sich unschwer forstellen kann sollen die linien natürlich am Rechteck enden,
(+/-) dem offset bei einem Kreis ist das kein so großes Problem aber beim Rechteck!

ich probiere schon eine weile und werde immer komplizierter.
Deswegen mal hier rein was euch "MeisterProggern" so dazu einfällt?

Muss ich für Jeden Quadranten des Rechtecks die Winkelstellung neu berechnen?

Code: Alles auswählen

#!/usr/bin/python
from Tkinter import *
from math import *
import os
class Application(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.grid()
        self.createWidgets()
        self.DoIt()
    def createWidgets(self):
        self.CanvasDrawings = []
        self.gcode = []
        self.PreviewFrame = Frame(self,bd=3)
        self.PreviewFrame.grid(row=0, column=0)
        self.PreviewCanvas = Canvas(self.PreviewFrame,width=300, height=300, bg='white', bd='3', relief = 'raised')
        self.PreviewCanvas.grid(sticky=N+S+E+W)
        self.XLine = self.PreviewCanvas.create_line(15,150,285,150, fill = 'green')
        self.YLine = self.PreviewCanvas.create_line(150,15,150,285, fill = 'green')
        self.EntryFrame = Frame(self,bd=5)
        self.EntryFrame.grid(row=0, column=1)
        self.rownumber = 0
        self.st00 = Label(self.EntryFrame, text='Spider a Rectangular Pocket',width=35)
        self.st00.grid(row=self.rownumber, column=0, columnspan=2)
        self.rownumber += 1
        self.st04 = Label(self.EntryFrame, text='Dimension (X/D,Y)')
        self.st04.grid(row=self.rownumber, column=0)
        self.PocketXVar = StringVar()
        self.PocketXVar.set('40.0')
        self.PocketX = Entry(self.EntryFrame, textvariable=self.PocketXVar ,width=5)
        self.PocketX.grid(row=self.rownumber, column=1, sticky = W)
        self.PocketYVar = StringVar()
        self.PocketYVar.set('30.0')
        self.PocketY = Entry(self.EntryFrame, textvariable=self.PocketYVar ,width=5)
        self.PocketY.grid(row=self.rownumber, column=1, sticky = E)
        self.rownumber +=1
        self.st05 = Label(self.EntryFrame, text='Start_Angel')
        self.st05.grid(row=self.rownumber, column=0)
        self.Start_angel_Var = StringVar()
        self.Start_angel_Var.set('22.5')
        self.Start_angel_Entry = Entry(self.EntryFrame, textvariable=self.Start_angel_Var ,width=5)
        self.Start_angel_Entry.grid(row=self.rownumber, column=1,sticky=W)
        self.rownumber +=1
        self.st06 = Label(self.EntryFrame, text='Spider_lines')
        self.st06.grid(row=self.rownumber, column=0)
        self.Spider_lines_Var = StringVar()
        self.Spider_lines_Var.set('8')
        self.Spider_lines_Entry = Entry(self.EntryFrame, textvariable=self.Spider_lines_Var ,width=5)
        self.Spider_lines_Entry.grid(row=self.rownumber, column=1,sticky=W)
        self.rownumber +=1
        self.st07 = Label(self.EntryFrame, text='Spider_Offset +/-')
        self.st07.grid(row=self.rownumber, column=0)
        self.Spider_offset_Var = StringVar()
        self.Spider_offset_Var.set('2.0')
        self.Spider_offset_Entry = Entry(self.EntryFrame, textvariable=self.Spider_offset_Var ,width=5)
        self.Spider_offset_Entry.grid(row=self.rownumber, column=1,sticky=W)
        self.rownumber += 1
        self.DoItButton = Button(self.EntryFrame, text='Recalculate', command=self.DoIt)
        self.DoItButton.grid(row=self.rownumber, column=1)
        self.quitButton = Button(self, text='Quit', command=self.quit)
        self.quitButton.grid(row=13, column=0, sticky=S)
        
    def DoIt(self):
        # erase old display objects as needed
        for draw in self.CanvasDrawings:
            self.PreviewCanvas.delete(draw)
        self.CanvasDrawings = []
        #temp variable
        self.ShapeVar=IntVar()
        self.ShapeVar.set(2)
        centerx=0.0
        centery=0.0
        start_angel=float(self.Start_angel_Entry.get())
        angel_lines=int(self.Spider_lines_Entry.get())
        spider_offset=float(self.Spider_offset_Entry.get())
        angel_space=360/angel_lines        
        #GRAFIK for screen
        if self.ShapeVar.get() == 2:      # rectangle
            # temps used for rectangular Pockets
            a = float(self.PocketXVar.get())/2.0
            b = float(self.PocketYVar.get())/2.0
            if a > b:
                Scale = float(self.PocketXVar.get()) * 1.2 / 300.0
            else:
                Scale = float(self.PocketYVar.get()) * 1.2 / 300.0
            #draw outer rect
            self.CanvasDrawings.append(self.PreviewCanvas.create_rectangle(
                150-a/Scale,
                150-b/Scale,
                150+a/Scale,
                150+b/Scale, outline='Black'))
            rec_corner_angel=degrees(atan(a/b))
            rec_hypo=a
            for line in range(angel_lines):
                line_angel=(line*angel_space)+start_angel
                """
                if line_angel <= rec_corner_angel or (line_angel > 180 and line_angel < (180+rec_corner_angel)):
                    rec_hypo=b/cos(radians(line_angel))
                else:
                    rec_hypo=a/cos(radians(line_angel))
                calc_angel=line_angel
                if line_angel > rec_corner_angel and line_angel <=90:
                    calc_angel=90-line_ang
                """
                calc_angel=line_angel
                newx=sin(radians(calc_angel))*(rec_hypo+spider_offset)
                newy=cos(radians(calc_angel))*(rec_hypo+spider_offset)
                self.CanvasDrawings.append(self.PreviewCanvas.create_line(150,150,150-newx/Scale,150-newy/Scale,fill="red"))
                #print line_angel
app = Application()
app.master.title("Spider_rechteck_test")
app.mainloop()
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

mit dem tan geht es:

Bild

ich habe die ganze skalierung herausgelöscht und ein paar Variablen umbenennt. Statt das ganze CanvasDrawing 2mal zu schreiben könnte man auch nur das Vorzeichen von line_x und line_y vertauschen (* -1.0).

Code: Alles auswählen

                line_x, line_y = b * tan(radians(line_angel)), b
                
                if abs(line_x) > a:
                    line_x, line_y = a, a / tan(radians(line_angel))
                
                if 135 <= line_angel < 135 + 180:
                    self.CanvasDrawings.append(self.PreviewCanvas.create_line(150,150,150+line_x,150+line_y,fill="red"))
                else:
                    self.CanvasDrawings.append(self.PreviewCanvas.create_line(150,150,150-line_x,150-line_y,fill="red"))
weiter musst du unbedingt die folgende Zeile:

Code: Alles auswählen

angel_space=360.0 / number_of_lines
mit .0 schreiben, sonst hast du Probleme wenn die Zahl nicht ohne Rest geteilt wird (sofern du Python < 3.0 verwendest).
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

:arrow: Danke super Sache
Respekt vor deiner logic 8)
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

So ich hab es nun implementiert und das klappt auch prima
die online gemeinde der Linuxcnc freunde dankt recht herzlich für die hilfe !
http://wiki.linuxcnc.org/cgi-bin/emcinf ... _Generator
Bild
Bild
Antworten