[Dreiecke] Herausfinden wenn Maus drüber/drinne ist

Übersicht BlitzBasic Beginners-Corner

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

Bobo2040

Betreff: [Dreiecke] Herausfinden wenn Maus drüber/drinne ist

BeitragSo, Feb 09, 2014 21:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Huhu
Ich würde gerne mal wissen wie ich herausfinden kann ob mein Mauszeiger in einem Dreieck
Ist oder nicht ? In einem Recht ist es ja easy einfach die Start/Ende Funktionen mit mousex mousey
Vergleichen aber ein Dreieck ist ja nur mit drei punkten und ja wie kann ich es machen ?
Das Dreieck ist mit 3 mal line gezeichnet Smile im Internet und in der Hilfe Funktion nichts gefunden
Denke das man sowas iwie ausrechnen kann ums dann mit x /y der Maus zu vergleichen....
Aber ich bin leider KEIN mathe Genie Smile

MFG

Xeres

Moderator

BeitragSo, Feb 09, 2014 21:29
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du nichts findest, suchst du nach den falschen Begriffen. Mit "Point in Triangle" sollte schon irgendwas brauchbares auftauchen.
Ich habe sogar mal einen Worklogeintrag dazu verfasst.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Bobo2040

BeitragSo, Feb 09, 2014 21:35
Antworten mit Zitat
Benutzer-Profile anzeigen
Hsha ja wie soll so ein noob wie ich auf point in triangle kommen ? Very Happy
Habe mit Maus über Dreieck etc probiert....
Habe mir jetzt über legt das ich neun Rect nehme esnauf MouseX und Y lege das ne Größe von z.b. 2*2px hat
Und dann mit rechts overlap mache aber zuerst gucje ich mir deinen Link mal an Smile
Und noch ne Frage kann ich die 3 Limes zu einer Art Object zsm fassen? Das es mit Rect overlap funktioniert...
Mfg

Ehm um ehrlich zu sein versteht ich die Funktionen zum Brechnennnicht wirklich...
Geht das nicht Leuchter bzw verständlich ? Nicht das du jetzt ne neue Funktion machen sollst oder deine Funktion schlecht ist Smile aber ich blicke die Funktion nicht Smile

Xeres

Moderator

BeitragSo, Feb 09, 2014 21:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du ein Dreieck in neun Rechtecke aufteilen kannst und das für deine Zwecke genau genug ist... nur zu.
Ich würde immer mathematisch exakte Lösungen bevorzugen wo immer es möglich ist - denn die funktionieren für alle Fälle und erzeugen keine zusätzlichen Bugs.
Eine Lösung innerhalb von 2 Minuten nicht verstehen zu können ist klar - woher soll das auch kommen? Du musst dich schon damit beschäftigen.

Klar kannst du Linien oder Dreiecke als Objekte behandeln; Einfach einen Type mit den nötigen Koordinatenpaaren erstellen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)
 

Bobo2040

BeitragSo, Feb 09, 2014 21:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm ne Rechtecke wollte ich eigentlich nicht Smile
Dann schau ich mir deine Funktion nochmal an und probiert sie zu verstehen Smile
Ich melde mich nochmal
Danke erstmal für die schnelle Antwort Smile

Mfg

DAK

BeitragSo, Feb 09, 2014 22:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Du, Bobo, nimms mir nicht böse, aber bitte bemühe doch Google für zumindest 10-20 Minuten bevor du postest. Ein Großteil deiner Fragen lässt sich durch einen Blick in die Hilfe / eine Forensuche / ein mal ausgiebig googlen lösen. Aber scheinbar postest du eher hier rein als das du selbst suchst.

Auch fragst du oft lieber noch mal nach, wenn du eine Antwort bekommst, statt zu versuchen, die Antwort wirklich zu verstehen.

Für einen blutigen Anfänger wäre das ok, aber du bist hier schon mehr als ein halbes Jahr.

Das klingt eventuell komisch, vor allem für einen Schüler, gut googlen können ist eine sehr wichtige Fähigkeit für Programmierer. Es kann auch nach Jahrzehnten Programmerfahrung niemand erwarten, dass man alles in jeder Programmiersprache und jedem Framework kann, aber wissen, woher man diese Informationen her bekommt ist auf jeden Fall drin.

Darum: Bevor du postest, schau dir die Hilfe, die Forensuche und Google für mindestens 15 Minuten an, und wenn du eine Lösung findest, die dir zu hoch ist, dann such nicht weiter sondern versuche die Lösung zu verstehen. Auch Lösungen in anderen Programmiersprachen kann man oft recht einfach umschreiben.


Noch eins:
Bobo2040 hat Folgendes geschrieben:
Aber ich bin leider KEIN mathe Genie Smile

Das ist etwas, was du öfters tust: Du willst fertige Lösungen für Sachen, wo du noch einen weiten Weg hast, sie zu verstehen (siehe deine letzte Frage zu Netzwerk und Types). Tu dir selbst einen Gefallen und lern eines nach dem anderen, und nicht alles auf einmal.

Edit: Noch ein zweites: Bitte verwende ab sofort Chrome oder einen anderen Browser mit eingebauter Rechtschreibkorrektur.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragSo, Feb 09, 2014 23:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja fertige Lösung mochte uch nicht also manchmal klar wenns nach 100versuchen nicht klappt dann fehlt einem halt oft die Motivation ... Und ichhabe mir jetzt mal über legt ben variieren des Dreieck zu machen und dann mit imagerotate zu drehen halt abhängig vom Winkel...
Bin grad am tablet habe das auch aufm tablet so geschrieben konnte es deshalb auch nicht testen Smile
Und ich weiß das ich die gleiche Funktion für die rechte Hälfte des graphic Bereichs machen muss Smile
BlitzBasic: [AUSKLAPPEN]

ShipX=320
ShipY=240
FixpunktX=320
FixpunktY=240

Ship=ImageRotate(Ship,Winkel)
Winkel=ATan2(Gegenkathete,Ankathete)
Gegenkathete=FixpunktY-MouseY()
Ankathete=FixpunktX-MouseX()

If Gegenkathete<0 Then
Gegenkathete*(-1)
EndIf

If Ankathete<0 Then
Ankathete*(-1)
EndIf


Schreibfehler können drinne sein Smile
Ist das so möglich also kann das funktionieren ?

Mfg
 

Tritium

BeitragMo, Feb 10, 2014 10:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Falls Dir Xeres Lösung nicht liegt gibt es auch die Möglichkeit, das vektoriell zu lösen. Dazu beschreibst Du jede Seite Deines Dreiecks so als Gerade (=Vektor), dass ein Vektor von A nach B, einer von B nach C und einer von C nach A zeigt*. Dann prüfst, ob der fragliche Punkt links von jedem der drei Vektoren liegt - das geht bspw. so: http://www.c-plusplus.de/forum/266934-full
Ist das der Fall, liegt der Punkt im Dreieck. Mach Dir einfach mal ne Skizze, zeichne die Sachen (Dreieck, A, B, C, drei Vektoren, zu prüfender Punkt) ein und überleg Dir anhand dessen, was passiert, wenn der Punkt mal im, und mal außerhalb des Dreiecks liegt.

Ob Dein Code funktioniert weiß ich nicht, hab ich nicht ausprobiert. Die zwei If-Verzweigungen machen bestimmt nicht das, was Du möchtest, da "Gegenkathete*(-1)" ja keine Zuweisung enthält, Du also einen Wert berechnest, und diesen dann keiner Variable zuweist. Übrigens lassen sich die beiden Ifs auch so ausdrücken:
BlitzBasic: [AUSKLAPPEN]
Gegenkathete = Abs(Gegenkathete)
Ankathete = Abs(Ankathete)

Ist das Gleiche.


*Da Du zuvor die Ecken Deines Dreieckes im math. Uhrzeigersinn mit A, B, C benannt hast.

Starwar

BeitragMo, Feb 10, 2014 11:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine recht einfache und allgemeine Lösung für konvexe Polygone: http://de.wikipedia.org/wiki/P...ach_Jordan
MFG

Midimaster

BeitragMo, Feb 10, 2014 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Einfachere Lösungen wären auch immer dann machbar, wenn die Dreiecke nicht beliebig sind, sondern immer ein vorgegebenes Aussehen haben, wie z.B. ein Spielfeld aus lauter gleichschenkligen Dreiecken....

Bobo.. Sind die Dreiecke schon irgenwie vorgegeben? Oder habe sie ein bestimmtes Aussehen?
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

Bobo2040

BeitragMo, Feb 10, 2014 14:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein sind nicht vorgegeben haben auch die gleiche Größe also ich kann mir aussuchen wie breit oder lang sie sind es sind z.b. 16 Felder von der Mitte ausgehend um den Spieler rum und jedes dieser Felder ist ein Dreieck Smile will aber nachtuerlich mehr als 16 Felder haben um einen fast lückenlosen Übergang in der Drehung des Spieler Schiffes zu haben Smile
Meine Idee war halt ohne die Dreiecke sondern anhand des Winkels soll das Schiff zur Maus gedreht werden so war jedenfalls meine Idee Smile

DAK

BeitragMo, Feb 10, 2014 14:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Wofür brauchst du die Dreiecke überhaupt?
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragMo, Feb 10, 2014 15:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja für die Felder Smile eigentlich weil ich keine Idee dafür habe
Das das Schiff egal wie es sich dreht und wendet die selbe Anzahl von px pro sek zurücklegt wollte ich wenn mousehit
True ist und es im Dreieck ist also die Maus dann soll das Schiff Bild geändert werden und die Geschwindigkeit also x=x+1 y=y-1 so in etwa damit es in die Richtung fliegt wo die Maus grad ist Smile
Mfg
 

PhillipK

BeitragMo, Feb 10, 2014 16:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie wärs mit Sinus / Cosinus?

Winkel zwischen Schiff / Maus:

Code: [AUSKLAPPEN]
winkel = Atan2( MausY - SchiffY, MausX - SchiffX)

verschiebungX = Cos(winkel)
verschiebungY = Sin(winkel)

(mal so als pseudocode, funktionen sollten existieren unter BlitzBasic)

Das dürfte das einfachste für dein beschriebenes problem sein Smile Wenn es "nur" zum bewegen das schiffs richtung maus ist. Beachte, das du SchiffY und SchiffX in Bildschirmkoordinaten eingeben musst, alternativ musst du die Maus in deine Spielwelt transformieren.
 

Bobo2040

BeitragMo, Feb 10, 2014 16:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja ist ja im Prinzip das
Was ich mit meinemmcode probiert habe Smile
Nur traue mit an COS nicht so wirklich ran blicke das nicht Smile
Nur noch eine frge wie kann ich die Geschwindigkeit zur zu drückte legten Strecke konstant halten ?
Weil wenn mein Schiff sich pro sek 50px bewegt sind das bei x+50 mehr als wenn ich diagonal fliege wenn ihr versteht was
Ich meine Smile gibts d ne Rechnung / tutorial zu ?
Mfg

DAK

BeitragMo, Feb 10, 2014 16:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ganz genau dafür ist das Cosinus/Sinus-Zeug da.

Und mit einer einfachen Forensuche nach "Cosinus Tutorial" findet sich eine ganze Seite von Suchresultaten, von denen in fast jedem erklärt wird, wie man sie verwendet. Bitte SUCHE ENDLICH MAL SELBST.
Gewinner der 6. und der 68. BlitzCodeCompo
 

Bobo2040

BeitragMo, Feb 10, 2014 17:22
Antworten mit Zitat
Benutzer-Profile anzeigen
-.-' ich meine ich blicke es allgemein nicht habes in der schule nicht verstanden und da hbe
Ich mir tuts angeschaut...

DAK

BeitragMo, Feb 10, 2014 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Selbst PhillipK hat in seinem Post dir alles erklärt, was du brauchst.

Wenn du deine Werte in seine Formeln einsetzt (brauchst nicht mal irgendwas dabei rechnen, nur einsetzen), dann hast du alles, was du brauchst.

verschiebungX und verschiebungY sind dabei die Geschwindigkeit deines Schiffs entlang der X- bzw. Y-Achse, die jedes Frame der Position hinzugefügt wird:

BlitzBasic: [AUSKLAPPEN]
positionX = positionX + verschiebungX
positionY = positionY + verschiebungY


Wenn du das nicht verstehst, dann würde ich dir raten, programmier etwas, was du verstehst. Oder warte, bis du in der Schule genügend weit bist, um mit sowas mit zu kommen.
Gewinner der 6. und der 68. BlitzCodeCompo

Midimaster

BeitragMo, Feb 10, 2014 17:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst im Grunde nicht so viel zu SIN() und COS() lernen, um das zu verwirklichen, was Du vorhast.

Die Bewegung hat eine Richtung. Aus jeder Richtung kann man einen COS() und einen SIN() berechnen. Wenn man diese Werte jetzt mit der Vorwärtsbewegung multipliziert, dann ergeben sich daraus die X- und Y-Werte, um die man das Schiff versetzen muss.

(Hinweis: Auch hier ist es wieder so, dass es noch einfacher wird wenn es z.b. nur 8 Richtungen, also 45°-Schritte geben soll. siehe am Ende)


Hier mal ein Beispiel für Bewegung in beliebige Richtung:


BlitzBasic: [AUSKLAPPEN]
SchiffX%=300
SchiffY%=300
Richtung%=230 ; in Grad
Speed%=50

SchiffX=SchiffX + Sin(Richtung)*Speed
SchiffY=SchiffY + Cos(Richtung)*Speed


das war's schon.


Nur 8 Richtungen:

Soll z.b. nur senkrecht, waagrecht und diagonal erlaubt sein, dann kannst Du komplett auf SIN COS verzichten und bei "diagonal" einfach statt mit +50 immer 50*0.7 also +35 dazuaddieren.

BlitzBasic: [AUSKLAPPEN]
SchiffX%=300
SchiffY%=300
Richtung%=45 ; in Grad
Speed%=50

If Richtung=45
AddX=35
AddY=-35
ElseIf Richtung=-45
AddX=-35
AddY=-35
Else
.....
EndIf

SchiffX=SchiffX + AddX
SchiffY=SchiffY + AddY



Zur Steuerung würde ich zunächst zu TASTATUR raten, sonst hast Du es bei der Frage "Winkel aus Maus" gleich auch noch mit ATAN() zu tun. Das lernst Du schon auch noch,a ber nicht im selben Moment wo Du SIN und COS zum ersten Mal verwendest.
Immer einen Schritt nach dem anderen!
 

Bobo2040

BeitragMo, Feb 10, 2014 18:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay danke Very Happy
Ich teste es aus bin grad am PC Very Happy
Nur ich will keine Funktion nehmen wenn ich nicht wirkliuch weiß was hinter steht also bei Cos Sin muss
+sie zwar nehmen aber was der bauer nicht kennt frisst er nicht :DDD
Nochmal ne frage habe iwie nen Problem mit meinem Server ich habe nen Type da sind die Variablen der User gespeichert iund die Communitcation zwischen Client und Server und Client zu Client klappt super Very Happy
Aber der Server soll bei einem Timeout den User nach 5 sek löschen ..er löscht auch
aber alle anderen ausser den ersten wenn ich 2 CLienten anmache wird der 2. gelöscht nach 5 sek obwohl daten versendet werden und auch beim Server ankommen...
BlitzBasic: [AUSKLAPPEN]

For info.Client=Each Client
If info\lastMsg<MilliSecs() Then
Print info\name$+" hat den Raum verlassen [Request Timeout]"
Delete info.Client
EndIf
Next

Mfg

PS: Ich weiß das info\Client nen schlechter name ist hatte es ausm Tut gelernt und habe es auch schon
auf Xeres sein Hinweis hin zu client.Client geändert jedoch sind die Files aufm Laptop Very Happy
Den hat meine Schwester also komme ich nicht dran Very Happy

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group