본문 바로가기

수학 & 코딩

2차원 평면에서 임의의 점을 모두 연결하는 다각형 폐곡면을 그리는 코드 (N = 10)

728x90

임의의 3개의 점들에 대해 :

임의의 4개의 점들에 대해 :

임의의 5개의 점에 대해 :

임의의  6개의 점들에 대해 :

임의의 7개의 점들에 대해 :

임의의 8개 점들에 대해 :

임의의 9개 점들에 대해 :

임의의 10개 점들에 대해 :

 

실행 코드 (12.py) : 최적화 미진행 버젼임.

import pygame, sys
from pygame.locals import *
import random
import numpy as np
import matplotlib.pyplot as plt
import math


def points_draw(points, dis_min, N):
    random.shuffle(points)
    dis = 0
    c_x = 0
    c_y = 0
    for i in range(len(points)):
        if i < len(points)-1:
            x0 = points[i][0]
            y0 = points[i][1]
            x1 = points[i+1][0]
            y1 = points[i+1][1]
        elif i == len(points)-1:
            x0 = points[i][0]
            y0 = points[i][1]
            x1 = points[0][0]
            y1 = points[0][1]
        dis += np.abs(x1 - x0)
        dis += np.abs(y1 - y0)
        c_x += x0
        c_y += y0
    cc_x = int(c_x/N)
    cc_y = int(c_x/N)

    if dis < dis_min:
        screen.fill('#000000')
        angle = []
        for j in range(len(points)):
            if j < len(points)-1:
                x0 = points[j][0]
                y0 = points[j][1]
                x1 = points[j+1][0]
                y1 = points[j+1][1]
                dx = cc_x - x0
                dy = cc_y - y0
                angle.append(math.atan2(dy, dx))
                pygame.draw.line(screen, '#00FF00', [x0, y0], [x1, y1], 1)
                pygame.draw.circle(screen, '#FF0000', [x0, y0], 3)
            elif j == len(points)-1:
                x0 = points[j][0]
                y0 = points[j][1]
                x1 = points[0][0]
                y1 = points[0][1]
                dx = cc_x - x0
                dy = cc_y - y0
                angle.append(math.atan2(dy, dx))
                pygame.draw.line(screen, '#00FF00', [x0, y0], [x1, y1], 1)
                pygame.draw.circle(screen, '#0000FF', [x0, y0], 3)
            pygame.draw.circle(screen, '#FFFFFF', [cc_x, cc_y], 3)
        dis_min = dis
        print(angle)

    return dis_min

pygame.init()

dis_width = 600
dis_height = 600
N = 6

screen = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption(str(N)+' points Simulation')
font = pygame.font.Font("C:\Windows\Fonts\HYSANB.ttf", 20)

FPS = 10
clock = pygame.time.Clock()

points = []
for i in range(N):
    x = random.randint(5, 595)
    y = random.randint(5, 595)
    points.append((x, y))
dis_min = 600*600
cou = 0
while True: # the main game loop
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
           
        if event.type == pygame.KEYDOWN:
            if event.key == K_DOWN:
                N -= 1
            if event.key == K_UP:
                N += 1
            pygame.display.set_caption(str(N)+' points Simulation')
            points = []
            for i in range(N):
                x = random.randint(5, 595)
                y = random.randint(5, 595)
                points.append((x, y))
            dis_min = 600*600
            cou = 0

    dis_min = points_draw(points, dis_min, N)

    #print(str(N) +' : ', dis_min)
    pygame.display.update()
    clock.tick(FPS)
   
pygame.quit()
728x90