给定4个代表四边形的顶点,如何将其划分为N个部分?

时间:2018-12-15 20:43:26

标签: python python-3.x quadrilaterals

我正在尝试给定代表四边形的两个维度(宽度和高度),将其划分为N个部分,其中每个部分尽可能地彼此成比例。

例如,假设一张纸。它由4分A, B, C, D组成 现在考虑这张纸的尺寸为800 x 800和点:

A: {0, 0}
B: {0, 800}
C: {800, 800}
D: {800, 0}

绘图将为您提供4点或3条线图。添加一个附加点E: {0, 0}以关闭该单元格。

我设法以编程方式对N个单元进行了此操作。 不幸的是,由于某种原因,当我设置N=4时,我得到了8个单元格...我被炸了,无法计算,所以我正在寻找三件事:

  • A)如何改进此代码以使其更具可读性?
  • B)如何改进此代码以使其更具pythonic性?
  • C)你猜对了。如何解决N=4问题?

完整代码:

import matplotlib.pyplot as plt


class QuadPartitioner:

    @staticmethod
    def get_factors(number):
        '''
        Takes a number and returns a list of factors
        :param number: The number for which to find the factors
        :return: a list of factors for the given number
        '''
        facts = []
        for i in range(1, number + 1):
            if number % i == 0:
                facts.append(i)
        return facts

    @staticmethod
    def get_partitions(N, quad_width, quad_height):

        '''
        Given a width and height, partition the area into N parts
        :param N: The number of partitions to generate
        :param quad_width: The width of the quadrilateral
        :param quad_height: The height of the quadrilateral
        :return: a list of a list of cells where each cell is defined as a list of 5 verticies
        '''

        # We reverse only because my brain feels more comfortable looking at a grid in this way
        factors = list(reversed(QuadPartitioner.get_factors(N)))

        # We need to find the middle of the factors so that we get cells
        # with as close to equal width and heights as possible
        split = int(len(factors)/2)
        factors = factors[split-1:split+1]

        # The width and height of an individual cell
        cell_width = quad_width / factors[0]
        cell_height = quad_height / factors[1]

        number_of_cells_in_a_row = factors[0]
        rows = factors[1]
        row_of_cells = []

        # We build just a single row of cells
        # then for each additional row, we just duplicate this row and offset the cells
        for n in range(0, number_of_cells_in_a_row):
                cell_points = []

                for i in range(0, 5):

                    cell_y = 0
                    cell_x = n * cell_width

                    if i == 2 or i == 3:
                        cell_x = n * cell_width + cell_width

                    if i == 1 or i == 2:
                        cell_y = cell_height

                    cell_points.append((cell_x, cell_y))

                row_of_cells.append(cell_points)

        rows_of_cells = [row_of_cells]

        # With that 1 row of cells constructed, we can simply duplicate it and offset it
        # by the height of a cell multiplied by the row number
        for index in range(1, rows):
            new_row_of_cells = [[ (point[0],point[1]+cell_height*index) for point in square] for square in row_of_cells]
            rows_of_cells.append(new_row_of_cells)

        return rows_of_cells


if __name__ == "__main__":

    QP = QuadPartitioner()
    partitions = QP.get_partitions(4, 800,800)

    for row_of_cells in partitions:
        for cell in row_of_cells:
            x, y = zip(*cell)
            plt.plot(x, y, marker='o')

    plt.show()

1 个答案:

答案 0 :(得分:0)

我通过更改来解决此问题:

split = int(len(factors)/2)
factors = factors[split-1:split+1]

收件人:

factor_count = len(factors)

if factor_count % 2 == 0:
    split = int(factor_count/2)
    factors = factors[split-1:split+1]
else:
    factors = []
    split = ceil(factor_count/2)
    factors.append(split)
    factors.append(split)