Pregunta

Primero de todo, estoy bastante seguro de que el ajuste a la cuadrícula es bastante fácil, sin embargo me he encontrado con alguna dificultad en esta situación y mis matemáticas son demasiado débiles para trabajar específicamente que es lo que está mal.

Esta es la situación que

Tengo un concepto abstracto de una cuadrícula, con Y pasos exactamente Y_STEP aparte (la x pasos están funcionando bien, por lo que los ignoran por ahora)

La cuadrícula es en abstracto, espacio de coordenadas, y a hacer las cosas a la línea de arriba tengo una magic desplazamiento de ahí, vamos a llamar a Y_OFFSET

ajuste a la cuadrícula tengo el siguiente código (python)

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

así que me pase de la posición del cursor, Y_OFFSET y Y_STEP en que la función y devuelve me el más cercano pisos y posición en la cuadrícula

Que parece funcionar bien en el original escenario, sin embargo al tomar en cuenta el hecho de que la vista es desplazable las cosas se ponen un poco raro.

El desplazamiento se hace tan básico como lo puedo conseguir, tengo una ventanilla que realiza el recuento de la distancia desplaza a lo largo del Eje y, y compensa todo lo que pasa a través de él.

He aquí un fragmento de el cursor del mouseMotion código:

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

Así que hay dos cosas que ver allí, en primer lugar el Desplazamiento del módulo de traducción de píxel de la posición a lo abstracto espacio de coordenadas, a continuación, la herramienta positionChanged función que toma el resumen de espacio de coordenadas de valor y se ajusta a la más cercana Y paso.

Aquí está el correspondiente Desplazamiento de código

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

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

Y la actualización de las herramientas de código

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

El último fragmento relevante es cuando la herramienta se va a representar en sí mismo.Pasa a través del Desplazamiento de objeto, la cual transforma la herramienta acoplada espacio de coordenadas de la posición en una pantalla píxel de la posición, aquí está el código:

#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)

¡Uf, que fue una larga explicación.Espero que aún estés conmigo...

El problema que estoy recibiendo ahora es que cuando me desplácese hasta la imagen dibujada pierde la alineación con el cursor.
Se inicia el ajuste a la Y paso exactamente 1 paso por debajo del cursor.Además parece fase dentro y fuera de allignment.
En algunos pergaminos es por 1 y otros rollos es perfecto.
Nunca por más de 1, y siempre que se ajuste a una válida la ubicación de la red.

Mejor supongo que se me ocurre es que en algún lugar yo soy de truncar algunos datos en el lugar equivocado, pero ni idea de dónde o cómo se termina con este comportamiento.

Cualquiera que esté familiarizado con espacios de coordenadas, el desplazamiento y el ajuste?

¿Fue útil?

Solución

Ok, estoy respondiendo a mi propia pregunta aquí, como alexk mencionado, el uso de int para truncar fue mi error.

El comportamiento estoy después de que se modela mejor por las matemáticas.floor().

Disculpas, la pregunta original no contiene suficiente información para calcular cuál es el problema.Yo no tengo el bit extra de información en ese momento.

Con respecto al error de la nota, creo que puede ser el uso, en un contexto de confusión...Desde la perspectiva de la positionChanged() función, el parámetro es una posición nueva que viene en.
Desde la perspectiva de la snapToGrid() función el parámetro es una posición original que está siendo cambiado a una posición acoplada.El lenguaje es como que porque parte de lo que es en mi caso el código de control y la otra parte está en mis servicios generales código.Yo debería haber cambiado para el ejemplo

Otros consejos

¿Tiene un error tipográfico en positionChanged() ?

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

Supongo que usted está fuera por un pixel debido a los problemas de precisión durante el flotador de la división.Trate de cambiar su snapToGrid() a este:

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

Gracias por la respuesta, no puede ser un error tipográfico, pero no puedo ver...

Por desgracia, el cambio snapToGrid no hacer una diferencia, así que no creo que ese es el problema.

No fuera por un píxel, sino fuera por Y_STEP.Jugando con un poco más he encontrado que no puedo conseguir que sea exacta en cualquier punto de que la pantalla se desplaza hacia arriba y también que se pasa hacia la parte superior de la pantalla, que sospecho que es la educación a distancia en la posición cero, así que supongo que mi problema es de alrededor de pequeño o valores negativos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top