Prüfen, ob eine Linie durch einen Würfel geht.

  • VB.NET
  • .NET (FX) 4.0

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    00yoshi schrieb:

    also ich benutze
    1. testest Du ein Rechteck, nicht aber einen Würfel, da fehlt die 3. Dimension.
    2. mit wievielen Punkten pro Gerade willst Du denn das durchziehen?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ich hätte das so gemacht:
    1. Strecke als Vektorgleichung
    2. Alle Würfelebenen ebenfalls als Vektorgleichung
    3. Mit jeder Ebene:
    3.1 Prüfen auf Schnittpunkt zwischen Gerade / Ebene (wird lustig, da du wegen Vector3D ein Gleichungssystem mit 3 Variablen haben wirst... vllt gibt es ja ne allgemeine Lösung dafür, wenn Gerade und Ebene ein bestimmtes Muster erfüllen... oder warte, es sollte eine geben ^^)
    3.2 Wenn ja, dann prüfen ob Schnittpunkt auch auf Strecke (nicht nur Gerade)
    4. Wenn 3.1 zwei Resultate erzielt, und 3.2 zweimal false, dann liegt Strecke im Würfel.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    wenn Gerade und Ebene ein bestimmtes Muster erfüllen
    Schnittpunkt Ebene-Gerade ist elementare Vektorrechnung.
    Nur muss geprüft werden, ob sich die Schnittpunkte im Würfel befinden, das ist ein wenig Fleißarbeit.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Schnittpunkt Ebene-Gerade ist elementare Vektorrechnung.

    Findest du ? Die Geradengleichung wäre X = U + t*V und die der Ebene wäre X = A + r*B + s*C (Caps = Vektoren). Beim Gleichstellen hat man 3 unbekannte, und durch die 3D Vektoren praktischerweise auch --> Gleichungssystem mit 3 Unbekannten. Ist halt erstmal nicht ganz so einfach das einem Programm beizubrigen ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Man nehme einfach die Normalform der Ebene, also (X-A) dot n = 0, n = B x C. Dort setze man einfach (u_i + t*v_i) ein und löse auf, schon hat man die Schnittstelle mit der Ebene. Ggf. kann man sogar ohne vollständiges Auflösen Rückschlüsse ziehen, wäre aber auch kein Beinbruch, wenn nicht.

    Gruß
    ~blaze~

    ThePlexian schrieb:

    Findest du ?
    Ja.
    Gib mal Schnittpunkt Ebene Gerade bei Frau Google ein.
    Ansonsten wäre das Thema für den TE zu hoch.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany : Okay, ich dachte das man Ebenen nur mit X = A + r*B + s*C (Caps = Vektoren) darstellen kann, aber scheinbar ja auch mit x1 + u * x2 + v * x3 + z = 0. Dann okay.
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Naja... zu der Lösung, die Linie in einzelne Punkte aufzuteilen, benutze ich gerade den Code:

    VB.NET-Quellcode

    1. For I As Double = 0 To 4 Step 0.0078125
    2. If ThereIsABlock(Mathematics.GetIntPos(New Point3(ViewPoint.X * I + Position.X, ViewPoint.Y * I + Position.Y, ViewPoint.Z * I + Position.Z)), Condition.Greater, 0) Then ' Prüft, ob die ID an der jeweiligen stelle über 0 ist.
    3. Drawer.DrawWireframe(Mathematics.GetIntPos(New Point3(ViewPoint.X * I + Position.X, ViewPoint.Y * I + Position.Y, ViewPoint.Z * I + Position.Z)), 1.01)
    4. SelectedBlock = Mathematics.GetIntPos(New Point3(ViewPoint.X * I + Position.X, ViewPoint.Y * I + Position.Y, ViewPoint.Z * I + Position.Z))
    5. Exit For
    6. End If
    7. Next

    Naja, da kann die Linie halt an den Ecken lang gehen, ohne den Block zu bemerken.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „00yoshi“ ()

    00yoshi schrieb:

    benutze ich gerade den Code:
    Wie kommst Du auf die Werte dieser For-Schleife?
    Du solltest zunächst die Mathematik hinter Deinem Problem verstehen, dazu brauchst Du keine Zeile Code.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!