LINUX.ORG.RU

История изменений

Исправление peregrine, (текущая версия) :

Какой-нибудь - это какой?

Это тот, в который гарантированно влезет твоя фигура. Но чтобы это обеспечить и гарантировать надо строить его вокруг старого AABBOX-а после поворота. Т.е. он практически во всех случаях (а точнее если был поворот) будет больше, чем надо. Вообще тебе надо перебирать координаты крайних точек как-то так (код очень не оптимален в плане того, что координаты изначально не хранятся в массиве, но так нагляднее, ИМХО):

# -*- coding: utf-8 -*-
from tkinter import *


class Point:
    def __init__(self, x_init, y_init):
        self.x = x_init
        self.y = y_init


def draw_polygon_with_bounds(points_init):
    max_y = points_init[0].y
    max_x = points_init[0].x
    min_y = points_init[0].y
    min_x = points_init[0].x
    temp_points = list()
    for i in points_init:
        temp_points.append(i.x)
        temp_points.append(i.y)
        if i.x > max_x:
            max_x = i.x
        if i.y > max_y:
            max_y = i.y
        if i.x < min_x:
            min_x = i.x
        if i.y < min_y:
            min_y = i.y
    canv.create_rectangle(min_x, min_y, max_x, max_y, fill='white', outline='green')
    canv.create_polygon(*temp_points, fill='white', outline='black')


scene_width = 640
scene_height = 480

points = list()

points.append(Point(40, 40))
points.append(Point(100, 30))
points.append(Point(80, 80))
points.append(Point(30, 90))

canv = Canvas(width=scene_width, height=scene_height, bg='white')
canv.pack()
draw_polygon_with_bounds(points)
mainloop()
Но у тебя SVG, а в SVG крайние точки могут и не храниться, как я понимаю, например если у тебя какая-то кривая, вроде безье. Ну и со шрифтами будет проблема.

Исправление peregrine, :

Какой-нибудь - это какой?

Это тот, в который гарантированно влезет твоя фигура. Но чтобы это обеспечить и гарантировать надо строить его вокруг старого AABBOX-а после поворота. Т.е. он практически во всех случаях (а точнее если был поворот) будет больше, чем надо. Вообще тебе надо перебирать координаты крайних точек как-то так (код очень не оптимален в плане того, что координаты изначально не хранятся в массиве, но так нагляднее, ИМХО):

# -*- coding: utf-8 -*-
import math
from tkinter import *


class Point:
    def __init__(self, x_init, y_init):
        self.x = x_init
        self.y = y_init


def draw_polygon_with_bounds(points_init):
    max_y = points_init[0].y
    max_x = points_init[0].x
    min_y = points_init[0].y
    min_x = points_init[0].x
    temp_points = list()
    for i in points_init:
        temp_points.append(i.x)
        temp_points.append(i.y)
        if i.x > max_x:
            max_x = i.x
        if i.y > max_y:
            max_y = i.y
        if i.x < min_x:
            min_x = i.x
        if i.y < min_y:
            min_y = i.y
    canv.create_rectangle(min_x, min_y, max_x, max_y, fill='white', outline='green')
    canv.create_polygon(*temp_points, fill='white', outline='black')


scene_width = 640
scene_height = 480

points = list()

points.append(Point(40, 40))
points.append(Point(100, 30))
points.append(Point(80, 80))
points.append(Point(30, 90))

canv = Canvas(width=scene_width, height=scene_height, bg='white')
canv.pack()
draw_polygon_with_bounds(points)
mainloop()
Но у тебя SVG, а в SVG крайние точки могут и не храниться, как я понимаю, например если у тебя какая-то кривая, вроде безье. Ну и со шрифтами будет проблема.

Исходная версия peregrine, :

Какой-нибудь - это какой?

Это тот, в который гарантированно влезет твоя фигура. Но чтобы это обеспечить и гарантировать надо строить его вокруг старого AABBOX-а после поворота. Т.е. он практически во всех случаях (а точнее если был поворот) будет больше, чем надо. Вообще тебе надо перебирать координаты крайних точек как-то так (код очень не оптимален в плане того, что координаты изначально не хранятся в массиве, но так нагляднее, ИМХО):

# -*- coding: utf-8 -*-
import math
from tkinter import *


class Point:
    def __init__(self, x_init, y_init):
        self.x = x_init
        self.y = y_init


def draw_polygon_with_bounds(points_init):
    max_y = points_init[0].y
    max_x = points_init[0].x
    min_y = points_init[0].y
    min_x = points_init[0].x
    temp_points = list()
    for i in points_init:
        temp_points.append(i.x)
        temp_points.append(i.y)
        if i.x > max_x:
            max_x = i.x
        if i.y > max_y:
            max_y = i.y
        if i.x < min_x:
            min_x = i.x
        if i.y < min_y:
            min_y = i.y
    canv.create_rectangle(min_x, min_y, max_x, max_y, fill='white', outline='green')
    canv.create_polygon(*temp_points, fill='white', outline='black')


scene_width = 640
scene_height = 480

points = list()

points.append(Point(40, 40))
points.append(Point(100, 30))
points.append(Point(80, 80))
points.append(Point(30, 90))

canv = Canvas(width=scene_width, height=scene_height, bg='white')
canv.pack()
draw_polygon_with_bounds(points)
mainloop()
Но у тебя SVG, а в SVG крайние точки могут и не храниться, как я понимаю, например если у тебя какая-то кривая, вроде безье.