I'm trying to program a Python GUI for about 2 - 3 days now, which allows to zoom into a color palette. Since in the GUI or in the window the coordinates start with 0 and get bigger and bigger on x and y, a translation of the points has to be done. Example: I have a list "palette" of 12 colors in the format: [rgb1, rgb2, rgb3 ... ] and would like to draw it on the window. I prefer to draw the color strip from left to right using a for loop, and each iteration it draws a line from bottom to top. so that each pixel does not have a different color, i would have to divide the loop variable by the range of the window and multiply it by the range of the palette. Then I would have to get the color from the list using the rounded value. If I then take this value with a variable (the zoom), I can zoom in and out of the color strip. But then the center of the zoom is always to the left of the window (and he first color) and not where my mouse is.
To put it briefly: How can I program something like this: https://www.geeksforgeeks.org/how-to-zoom-in-on-a-point-using-scale-and-translate/, if I don't want to draw a single square at x1, y1, x2, y2, but a loop that iterates over the canvas? NOTE: i need this only for the x axis, the y axis is fixed. Any help and formula (note that i want to use a render loop) is welcome!
PS: here is my "mathematically incorrect" code (Python and pyqt6):
def paintEvent(self, e):
qp = QPainter()
qp.begin(self)
palette = [QColor(0,0,0),QColor(100,0,0),QColor(0,100,0),QColor(0,0,100),QColor(100,0,100),QColor(255,0,0)]
Range = self.width()-20
Len = len(palette)
for k in range(Range):
P = (((k-self.P)*self.zoom)+self.P)/Range*Len
if P >= 0 and P < Len:
qp.setPen(palette[math.floor(P)])
qp.drawLine(10+k,0,10+k,self.width())
def wheelEvent(self, e):
if e.angleDelta().y() < 0:
self.zoom = self.zoom/1.25
else:
self.zoom = self.zoom*1.25
self.P -= (e.position().x() + self.P)/self.zoom
print(self.P)
self.update()
self.P = e.position().x()-self.width()/2
I tried to use some formulas from the internet but these were different (not meant for iterating) Additionally, I tried to create my own formula, but either I didn't see where the color palette flew to, or it didn't zoom in the direction of my mouse.... It should look like a zoom function in an image editing program.
source https://stackoverflow.com/questions/74903257/zoomable-plot-of-a-list-of-colors-in-python-with-different-coordinate-systems
Comments
Post a Comment