Ткинтер печатная линия в обратном направлении - PullRequest
0 голосов
/ 28 июня 2019

поэтому моя программа распечатывает изображение на холсте с проходящей через него линией.Когда программа запускается, в середине печатается квадрат с кружком внутри.Однако также подразумевается, что это линия, проходящая по диагонали через весь холст.У меня все работает, за исключением линии, идущей в неправильном направлении, она должна быть как бы перевернута, должна быть по диагонали с другой стороны, и я не могу понять, почему.Мой код кажется правильным, и если что-то не так, я думаю, что это как-то связано с преобразованиями.Большое спасибо заранее.

""" Enter your name(s) here


"""
from tkinter import *

class Mapping_for_Tkinter:

def __init__(self, xmin, xmax, ymin, ymax, width):
    self.__xmin = xmin
    self.__xmax = xmax
    self.__ymin = ymin
    self.__ymax = ymax
    self.__width = width
    self.__height = width * ((ymax - ymin) / (xmax - xmin))

def set_xmin(self, xmin):
    self.__xmin = xmin
    self.__set_height()  # update height

def set_xmax(self, xmax):
    self.__xmax = xmax
    self.__set_height()

def set_ymin(self, ymin):
    self.__ymin = ymin
    self.__set_height()

def set_ymax(self, ymax):
    self.__ymax = ymax
    self.__set_height()

def set_width(self, width):
    self.__width = width
    self.__set_height()

def __set_height(self):  # when changing size, always call this private method
    self.__height = self.__width * ((self.__ymax - self.__ymin) / (self.__xmax - self.__xmin))

def get_xmin(self):
    return self.__xmin

def get_xmax(self):
    return self.__xmax

def get_ymin(self):
    return self.__ymin

def get_ymax(self):
    return self.__ymax

def get_width(self):
    return self.__width

def get_height(self):
    return self.__height

# TODO: FIX SCALE CONVERSION
########################
########################
########################
def get_x(self, i):
    # retval = ((float(X - A) / (B - A)) * (D - C)) + C
    # a-b is 0 to width-1
    # c-d is xmin to xmax
    return ((float(i) / (self.__width - 1)) * (self.__xmax - self.__xmin)) + self.__xmin

def get_y(self, y):
    return ((float(y) / (self.__height - 1)) * (self.__ymax - self.__ymin)) + self.__ymin

def get_i(self, x):
    # retval = ((float(X - A) / (B - A)) * (D - C)) + C
    # a-b is xmin to xmax
    # c-d is 0 to width-1
    return ((float(x - self.__xmin) / (self.__xmax - self.__xmin)) * (self.__width - 1))

def get_j(self, y):
    return ((float(y - self.__ymin) / (self.__ymax - self.__ymin)) * (self.__width - 1))

def __str__(self):
    return (str(self.__xmin) + " " + str(self.__xmax) + " " + str(self.__ymin) + " " +
            str(self.__ymax) + " " + str(self.__width) + " " + str(self.__height))


""" to complete"""


def main():
m = Mapping_for_Tkinter(-5.0, 5.0, -5.0, 5.0, 500)  # instantiate mapping
print(m)  # print info about object

window = Tk()  # instantiate a tkinter window
canvas = Canvas(window, width=m.get_width(), height=m.get_height(), bg="white")  # create a canvas width*height
canvas.pack()
# create rectangle the Tkinter way
print("Draw rectangle using tkinter coordinates at (100,400) (400,100)")
canvas.create_rectangle(100, 400, 400, 100, outline="black")

# create circle using the mapping
print("Draw circle using math coordinates at center (0,0) with radius 3")
canvas.create_oval(m.get_i(-3.0), m.get_j(-3.0), m.get_i(3.0), m.get_j(3.0), outline="blue")

# create y=x line pixel by pixel using the mapping
print("Draw line math equation y=x pixel by pixel using the mapping")
for i in range(m.get_width()):
    x = m.get_x(i)  # obtain the x coordinate
    y = x
    canvas.create_rectangle((m.get_i(x), m.get_j(y)) * 2, outline="green")

window.mainloop()  # wait until the window is closed


if __name__ == "__main__":
main()
...