заливка пересечения

koshka

Новичок
Пользователь
Апр 15, 2020
2
1
3
есть 2 прямоугольника которые пересекаются как найти их пересечение и выполнить его заливку нажатием на кнопку

Python:
from tkinter import *
from math import *

def is_cross(a,b):
    ax1,ay1,ax2,ay2 = a[0],a[1],a[2],a[3]          # прямоугольник А
    bx1, by1, bx2, by2 = b[0], b[1], b[2], b[3]    # прямоугольник B
    # это были координаты точек диагонали по каждому прямоугольнику

    # 1. Проверить условия перекрытия, например, если XПA<XЛB ,
    #    то прямоугольники не пересекаются,и общая площадь равна нулю.
    #   (это случай, когда они справа и слева) и аналогично, если они сверху
    #    и снизу относительно друг друга.
    #    (XПА - это  Х Правой точки прямоугольника А)
    #    (ХЛВ - Х Левой точки прямоугольника В )
    #    нарисуй картинку (должно стать понятнее)

    xA = [ax1,ax2]  # координаты x обеих точек прямоугольника А
    xB = [bx1,bx2]  # координаты x обеих точке прямоугольника В

    yA = [ay1, ay2]  # координаты x обеих точек прямоугольника А
    yB = [by1, by2]  # координаты x обеих точек прямоугольника В

    if max(xA)<min(xB) or max(yA) < min(yB) or min(yA) > max(yB):
        return False    # не пересекаются

    # 2. Определить стороны прямоугольника образованного пересечением,
    # например,
    # если XПA>XЛB, а XЛA<XЛB, то ΔX=XПA−XЛB

    elif max(xA)>min(xB) and min(xA)<min(xB):
        dx = max(xA)-min(xB)
        return True     # пересекаются
    else:
        return True     # пересекаются

def new(N):
    for i in range(len(N) - 1):
        canvas.create_rectangle(xA,  Ya, width=5, fill='red')

def click(click_event):
    global prev
    try:
        canvas.create_rectangle(prev.x, prev.y, click_event.x, click_event.y, width=2)
    except:
        prev = click_event
        return
    prev = click_event

def move(move_event):
    global prev
    canvas.create_rectangle(prev.x, prev.y, move_event.x, move_event.y, width=2)
    prev = move_event

master = Tk()
canvas = Canvas(master, width=600, height=300)
canvas.pack(padx=20, pady=20)
canvas.bind('<Button-1>', click)
but1 = Button(master, text='генерализация', command=is_cross );
mainloop()

Без имени-1.jpg
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вот пример:
Python:
import tkinter as tk


rects = []
clicks = []


def intersects(one, two):
    x1 = max(min(one[0], one[2]), min(two[0], two[2]))
    y1 = max(min(one[1], one[3]), min(two[1], two[3]))
    x2 = min(max(one[0], one[2]), max(two[0], two[2]))
    y2 = min(max(one[1], one[3]), max(two[1], two[3]))
    if x1 < x2 and y1 < y2:
        canvas.create_rectangle(x1, y1, x2, y2, fill='red')
    else:
        return False


def get_intersections():
    if len(rects) >= 2:
        intersects(canvas.coords(rects[-2]), canvas.coords(rects[-1]))


def handle_clicks(event):
    clicks.append([event.x, event.y])
    if len(clicks) >= 2:
        rects.append(canvas.create_rectangle(clicks[-2], clicks[-1]))
        clicks.clear()


def clear():
    canvas.delete('all')
    rects.clear()


master = tk.Tk()
master.config(bg='gray')
canvas = tk.Canvas(master, width=600, height=300)
canvas.pack()
canvas.bind("<Button-1>", handle_clicks)

but1 = tk.Button(master, text="Пересечение", command=get_intersections)
but1.pack(side='left')
but2 = tk.Button(master, text="Очистить", command=clear)
but2.pack(side='left')
master.mainloop()
 
  • Мне нравится
Реакции: Student

Форум IT Специалистов