Kreis Punkte setzen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Kreis Punkte setzen

Beitrag von roherter »

Ich möchte von einem vorgebenen Startpunkt aus Punkte setzen die im Kreis verlaufen, soll heißen ich gebe den Startpunkt x,y vor und möchte dann von dort aus vom Mittelpunkt ausgehend ein Kreis oder punkte zeichen.
Versuch noch mal anders ich habe ein bild das 500x500 pixel hat.

Mittelpunkt ist jetzt 250x250 wenn ich jetzt z.b. mit der maus ins bild klicke möchte ich das von dort aus der kreis gezeichnet wir in bezug auf den Mittelpunkt(radius)!

Ich habe hier schon etwas versucht aber klappt nicht so wie ich will vielleicht kann jemand helfen:

Code: Alles auswählen


Global teiler.l,Image0
teiler=360/12



Enumeration
  #Window_0
EndEnumeration



Enumeration
  #Image_0
EndEnumeration






Image0 = CreateImage(0,500,500)
StartDrawing(ImageOutput(0))
Box(0,0,500,500,RGB(255,255,255))
StopDrawing()


Procedure GetMouseX(Gadget)
  GetCursorPos_(mouse.POINT)
  MapWindowPoints_(0,GadgetID(Gadget),mouse,1)
  ProcedureReturn mouse\x
EndProcedure


Procedure GetMouseY(Gadget)
  GetCursorPos_(mouse.POINT)
  MapWindowPoints_(0,GadgetID(Gadget),mouse,1)
  ProcedureReturn mouse\y
EndProcedure
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 391, 283, 521, 511, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 10, 10, 500, 500, Image0)
      
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
  
  Event = WaitWindowEvent() 
  
  WindowID = EventWindow()
  
  GadgetID = EventGadget()
  
  EventType = EventType()
  
  
  If  GetAsyncKeyState_(#VK_LBUTTON)
    winkel=0
    posx= GetMouseX(#Image_0)
    posy=GetMouseY(#Image_0)
    x_mitte=250
    y_mitte=250
    If posx>0 And posx<501
      If posy>0 And posy<501
        Debug "x"+Str(posx)
        Debug "y"+Str(posy)
        Repeat
          If winkel < 370
            winkel + teiler % 360
            x = posx * Cos(winkel *(2*3.1415/360)) + x_mitte ; Winkel als Bogenmaß
            y = posy * Sin(winkel *(2*3.1415/360)) + y_mitte
            StartDrawing(ImageOutput(0))
            Box(posx,posy,4,4,RGB(0,0,0))
            Box(x,y,4,4,RGB(0,0,0))
            StopDrawing()
            SetGadgetState(#Image_0,ImageID(0))
          EndIf
        Until  winkel>360
      EndIf
    EndIf
  EndIf
  If Event = #PB_Event_Gadget
    
    
    
  EndIf
  
Until Event = #PB_Event_CloseWindow

End


Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

du musst das so machen :

Code: Alles auswählen

      If posy>0 And posy<501 
        Debug "x"+Str(posx) 
        Debug "y"+Str(posy) 
        Radius.f = Sqr(Pow(posx-x_mitte,2)+Pow(posy-y_mitte,2))
        Repeat 
          If winkel < 370 
            winkel + teiler % 360 
            x = Radius * Cos(winkel *(2*3.1415/360)) + x_mitte ; Winkel als Bogenmaß 
            y = Radius * Sin(winkel *(2*3.1415/360)) + y_mitte 
            StartDrawing(ImageOutput(0)) 
            Box(posx,posy,4,4,RGB(0,0,0)) 
            Box(x,y,4,4,RGB(0,0,0)) 
            StopDrawing() 
            SetGadgetState(#Image_0,ImageID(0)) 
          EndIf 
        Until  winkel>360 
      EndIf 
Also mit dem Radius rechnet nicht mit dem jeweiligen Abstand von x und y

Außerdem würde ich dir raten den Kreis aus Linien zu machen die dnan immer von Winkel zu Winkel+2 oder Winkel+5 gehen, damit erhätst du immer ein geute Kreis egal wie groß er wird, bei Punkte hast du ja immer das prob ei großen kreisen

EDIT: Hier n version mit LINEXY()

Code: Alles auswählen

        If winkel < 370 
         winkel + teiler % 360 
         x1 = Radius * Cos(winkel *(2*3.1415/360)) + x_mitte ; Winkel als Bogenmaß 
         y1 = Radius * Sin(winkel *(2*3.1415/360)) + y_mitte 
         x2 = Radius * Cos((winkel+teiler) *(2*3.1415/360)) + x_mitte ; Winkel als Bogenmaß 
         y2 = Radius * Sin((winkel+teiler) *(2*3.1415/360)) + y_mitte 
         StartDrawing(ImageOutput(0)) 
          LineXY(x1,y1,x2,y2,0) 
         StopDrawing() 
         SetGadgetState(#Image_0,ImageID(0)) 
        EndIf 
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

STARGÅTE hat geschrieben:bei Punkte hast du ja immer das prob ei großen kreisen
Du sprechen Deutsch? ;)
Hab nix verstanden.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
ZeHa
Beiträge: 4760
Registriert: 15.09.2004 23:57
Wohnort: Friedrichshafen
Kontaktdaten:

Beitrag von ZeHa »

Du kannst Dir auch den Bresenham-Algorithmus anschauen, der kommt völlig ohne Winkelzeugs aus... und ist soweit ich weiß der Standard-Algorithmus den die meisten Zeichenprogramme und -Libs einsetzen. Den gibt's für Linien und für Kreise.
Bild     Bild

ZeHa hat bisher kein Danke erhalten.
Klicke hier, wenn Du wissen möchtest, woran ihm das vorbeigeht.
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Das was ich an der stelle Male soll sich halt im kreis, also hier an allen 12 stellen vortsetzen oder dort auch gemalt werden das bekomme ich irgendwie nicht richtig hin :cry: ?
Es ist eigentlich ja auch keinkreis sondern ein 12eck muss mal schauen ob ich das irgendwie berechen kann! :freak:
Zuletzt geändert von roherter am 06.02.2008 10:25, insgesamt 1-mal geändert.
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Meinst du so?

Tip: Strg+Linksklick zum markieren des Quellcodes

Code: Alles auswählen

Global teiler.l,Image0
teiler=360/12



Enumeration
  #Window_0
EndEnumeration



Enumeration
  #Image_0
EndEnumeration






Image0 = CreateImage(0,500,500)
StartDrawing(ImageOutput(0))
Box(0,0,500,500,RGB(255,255,255))
StopDrawing()


Procedure GetMouseX(Gadget)
  GetCursorPos_(mouse.POINT)
  MapWindowPoints_(0,GadgetID(Gadget),mouse,1)
  ProcedureReturn mouse\x
EndProcedure


Procedure GetMouseY(Gadget)
  GetCursorPos_(mouse.POINT)
  MapWindowPoints_(0,GadgetID(Gadget),mouse,1)
  ProcedureReturn mouse\y
EndProcedure
Procedure Open_Window_0()
  If OpenWindow(#Window_0, 391, 283, 521, 511, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      ImageGadget(#Image_0, 10, 10, 500, 500, Image0)
     
    EndIf
  EndIf
EndProcedure

Open_Window_0()

Repeat
 
  Event = WaitWindowEvent()
 
  WindowID = EventWindow()
 
  GadgetID = EventGadget()
 
  EventType = EventType()
 
 
  If  GetAsyncKeyState_(#VK_LBUTTON)
    winkel=0
    posx= GetMouseX(#Image_0)
    posy=GetMouseY(#Image_0)
    x_mitte=250
    y_mitte=250
    If posx>0 And posx<501
      If posy>0 And posy<501
;        Debug "x"+Str(posx)
;        Debug "y"+Str(posy)
        For i = 1 To 12
          winkel = i*360/12
          rad = 50
          x = posx + Cos(winkel*#PI/180)*rad
          y = posy + Sin(winkel*#PI/180)*rad
          StartDrawing(ImageOutput(0))
          Box(posx,posy,4,4,RGB(0,0,0))
          Box(x,y,4,4,RGB(0,0,0))
          StopDrawing()
          SetGadgetState(#Image_0,ImageID(0))
        Next
      EndIf
    EndIf
  EndIf
  If Event = #PB_Event_Gadget
   
   
   
  EndIf
 
Until Event = #PB_Event_CloseWindow

End 
Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Fast das ist schon nicht schlecht nurd as sich das alles auf den mittelpunkt des bildes beziehen soll.soll heißen der mittelpunkt muss immer bei 250,250 liegen!
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Wo sollen die anderen Mittelpunkte liegen?

Im Kreis darum angeordnet oder?

Erhöh mal den rad Wert auf 220 und sag mir dann obs nicht besser ist.

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
roherter
Beiträge: 1407
Registriert: 10.04.2005 18:58
Kontaktdaten:

Beitrag von roherter »

Vielleicht kann man hier besser erkennen was ich meine hab mal ebend ne Skizze gemacht!
Bild
Purebasic 5.0 32bit und 64 bit

I'm back from hell
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Aaaahhhhhhhhssooooooo....

Du musst nur rausfinden, in welchem "Kuchenstück" sich die Mausbefindet, den x und y Abstand zum Punkt des Stücks ermitteln und auf alle anderen Punkte übertragen....

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten