Frage

Zunächst einmal, ich bin ziemlich sicher Gitter schnappen ist ziemlich einfach, aber ich habe in dieser Situation in eine ungeradeen Schwierigkeiten geraten und meine Mathe ist zu schwach, speziell um herauszufinden, was falsch ist.

Hier ist die Situation

Ich habe ein abstraktes Konzept eines Gitters, mit Y genau die Schritte Y_STEP auseinander (die x Schritte, um sie in Ordnung so ignorieren jetzt arbeiten)

Das Gitter ist in einem abstrakten Raum zu koordinieren, und die Dinge zu bekommen, um in einer Reihe aufstellen ich einen Zauber dort versetzt haben, nennen wir es Y_OFFSET

an das Netz schnappen ich den folgenden Code (Python) habe

def snapToGrid(originalPos, offset, step):
    index = int((originalPos - offset) / step) #truncates the remainder away
    return index * gap + offset

, damit ich die Cursorposition passieren, Y_OFFSET und Y_STEP in diese Funktion und es gibt mir die nächste Boden y-Position auf dem Gitter

Das scheint im ursprünglichen Szenario gut zu funktionieren, aber wenn ich zu berücksichtigen, dass die Aussicht ist scrollbaren Dinge ein wenig seltsam zu bekommen.

Scrolling wird als basisch gemacht, wie ich es bekommen kann, ich ein Ansichtsfenster haben, die entlang der Y-Achse gescrollt Zählung der Abstand hält und ausgleicht nur alles, was durch sie geht.

Hier ist ein Ausschnitt aus dem mouseMotion Code des Cursors:

def mouseMotion(self, event):
    pixelPos = event.pos[Y]
    odePos = Scroll.pixelPosToOdePos(pixelPos)
    self.tool.positionChanged(odePos)

Es gibt also zwei Dinge dort zu suchen, zunächst die Übersetzung des Scroll-Modul von Pixelposition auf dem abstrakten Koordinatenraum, dann die Position Funktion des Werkzeugs, das die abstrakte nimmt Raum-Koordinatenwert und fängt den nächsten Y Schritt.

Hier ist der relevante Scroll-Code

def pixelPosToOdePos(pixelPos):
    offsetPixelPos = pixelPos - self.viewPortOffset
    return pixelsToOde(offsetPixelPos)

def pixelsToOde(pixels):
    return float(pixels) / float(pixels_in_an_ode_unit)

Und die Tools Update-Code

def positionChanged(self, newPos):
    self.snappedPos = snapToGrid(originalPos, Y_OFFSET, Y_STEP)

Der letzte relevante Brocken ist, wenn das Werkzeug selbst zu machen geht. Es geht durch das Scroll-Objekt, das das Tool verwandelt Raumposition in eine Bildschirm-Pixel-Koordinatenposition geschnappt, hier ist der Code:

#in Tool
def render(self, screen):
    Scroll.render(screen, self.image, self.snappedPos)

#in Scroll
def render(self, screen, image, odePos):
    pixelPos = self.odePosToPixelPos(odePos)
    screen.blit(image, pixelPos) # screen is a surface from pygame for the curious

def odePosToPixelPos(self.odePos):
    offsetPos = odePos + self.viewPortOffset
    return odeToPixels(offsetPos)

def odeToPixels(odeUnits):
    return int(odeUnits * pixels_in_an_ode_unit)

Puh, das war eine lange Erklärung. Hoffe, dass Sie immer noch bei mir sind ...

Das Problem, das ich jetzt bin immer ist, dass, wenn ich das gezeichnete Bild mit dem Cursor verliert Ausrichtung nach oben.
Sie beginnt Aufschnappen auf die Y-Stufe genau 1 Stufe unter dem Cursor. Außerdem scheint es, Phase in und aus allignment.
An einigen Rollen ist es um 1 und andere Rollen heraus ist es genau das Richtige.
Es ist nie um mehr als 1 und es ist immer auf eine gültige Rasterposition einrasten lassen.

Best guess ich mit oben kommen kann ist, dass irgendwo ich einige Daten in der falschen Stelle bin Kürzen, aber keine Ahnung, wo oder wie sie mit diesem Verhalten enden.

Jeder, der mit Leerzeichen koordinieren, Scrollen und schnappen?

War es hilfreich?

Lösung

Ok, ich bin der Beantwortung hier meine eigene Frage, wie AlexK erwähnt, int mit meinem Fehler gestutzt war.

Das Verhalten Ich bin nach wird am besten durch Math.floor modelliert ().

Apologies, die ursprüngliche Frage enthält nicht genügend Informationen, um wirklich herauszufinden, was das Problem ist. Ich habe nicht das Extra an Information haben an diesem Punkt.

Im Hinblick auf die Typo Note, ich glaube, ich kann den Kontext, in einer verwirrenden Art und Weise unter Verwendung von ... Aus der Sicht der Position () Funktion ist der Parameter eine neue Position kommt in.
Aus der Sicht der SnapToGrid () Funktion ist der Parameter eine Ausgangsposition, die zu einer gerissenen Position geändert wird. Die Sprache ist so, weil ein Teil davon in meinem Event-Handling-Code ist und der andere Teil ist in meinem allgemeinen Dienstleistung Code. Ich habe es für das Beispiel geändert sollte

Andere Tipps

Haben Sie einen Tippfehler in Position ()?

def positionChanged(self, newPos):
    self.snappedPos = snapToGrid(newPos, Y_OFFSET, Y_STEP)

Ich denke, Sie weg von einem Pixel sind wegen der Genauigkeitsprobleme bei float Division. Versuchen Sie, Ihre SnapToGrid (), um diese:

def snapToGrid(originalPos, offset, step):
    EPS = 1e-6
    index = int((originalPos - offset) / step  + EPS) #truncates the remainder away
    return index * gap + offset

Danke für die Antwort, kann es ein Tippfehler sein, aber ich kann es nicht sehen ...

Leider zu SnapToGrid die Änderung keinen Unterschied machen, so dass ich glaube nicht, das ist das Problem.

Es ist nicht weg von einem Pixel, sondern aus es durch Y_STEP. Spielen, um mit ihm einige mehr ich gefunden habe, dass ich es an jedem Punkt genau nicht bekommen kann sein, dass der Bildschirm nach oben gescrollt und auch, dass es in Richtung des oberen Rand des Bildschirms geschieht, was ich vermute, ist ODE Position Null, so ich vermute, mein Problem um kleine oder negative Werte ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top