From 7bd795e85d61d306eaec7a81605672565c63c17f Mon Sep 17 00:00:00 2001 From: Astatin3 <77305074+Astatin3@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:36:46 -0600 Subject: [PATCH] Bezier curve code --- frc2024.png | Bin 0 -> 50640 bytes main.py | 141 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 frc2024.png create mode 100644 main.py diff --git a/frc2024.png b/frc2024.png new file mode 100644 index 0000000000000000000000000000000000000000..4a384db4129c89e5bd14d84c8675ebed14f6f6d8 GIT binary patch literal 50640 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 literal 0 HcmV?d00001 diff --git a/main.py b/main.py new file mode 100644 index 0000000..1c22339 --- /dev/null +++ b/main.py @@ -0,0 +1,141 @@ +import math +import pygame as pg +from pygame.locals import * +from sys import exit +import numpy as np + +doubleClickDuration = 200 + +nodeColor = (255, 255, 255) +nodeRadius = 15 + +lineApproximationLineColor = (127, 127, 127, 0.5) +lineApproximationLineWidth = 3 + +curvePointCount = 300 +curvePointColor = (255, 255, 0) +curvePointRadius = 2 + +curveEditPointColor = (0, 255, 255) +curveEditPointRadius = 5 + +pg.init() + +# fieldImg = Background("frc2024.png", (0, 0)) + +fieldImg = pg.image.load("frc2024.png") + +screen_width = fieldImg.get_width() +screen_height = fieldImg.get_height() + +screen = pg.display.set_mode((screen_width, screen_height)) +fieldImg = pg.image.load("frc2024.png").convert_alpha() +pg.display.set_caption("Auto Planner") + + +curveEditPoints = [] +nodes = [] + +def addNode(pos): + nodes.append(pos) + if len(nodes) > 1: + index = len(nodes)-1 + # Middle point between current point and previous point + editPos = (nodes[index-1][0]+pos[0])/2,(nodes[index-1][1]+pos[1])/2 + curveEditPoints.append(editPos) + +def bezier(p0, p1, p2): + #for p in [p0, p1, p2]: + # pg.draw.circle(screen, (255, 255, 255), p, 5) + for t in np.arange(0, 1, 1/curvePointCount): + px = p0[0]*(1-t)**2 + 2*(1-t)*t*p1[0] + p2[0]*t**2 + py = p0[1]*(1-t)**2 + 2*(1-t)*t*p1[1] + p2[1]*t**2 + pg.draw.circle(screen, curvePointColor, (px, py), curvePointRadius) + +def refresh(): + pg.draw.rect(screen, (0, 0, 0), (0, 0, screen_width, screen_height)) + screen.blit(fieldImg, screen.get_rect()) + for i in range(0,len(curveEditPoints)): + pg.draw.line(screen, lineApproximationLineColor, nodes[i], curveEditPoints[i], lineApproximationLineWidth) + pg.draw.line(screen, lineApproximationLineColor, curveEditPoints[i], nodes[i+1], lineApproximationLineWidth) + bezier(nodes[i], curveEditPoints[i], nodes[i+1]) + pg.draw.circle(screen, curveEditPointColor, curveEditPoints[i], curveEditPointRadius) + for pos in nodes: + pg.draw.circle(screen, nodeColor, pos, nodeRadius) + pg.display.update() + +def getElemAt(pos): + for i in range(0,len(curveEditPoints)): + if getDist(pos, curveEditPoints[i], curveEditPointRadius): + return 1, i + for i in range(0,len(nodes)): + if getDist(pos, nodes[i], nodeRadius): + return 0, i + return -1, -1 + +def getDist(pos1, pos2, dist): + return math.sqrt(math.pow(pos1[0]-pos2[0], 2) + math.pow(pos1[1]-pos2[1], 2)) <= dist + +def singleClick(): + pos = pg.mouse.get_pos() + addNode(pos) + refresh() + +def doubleClick(): + curveEditPoints = [] + nodes = [] + refresh() + +refresh() + +running = True +last_click = -1 + +clickType = -1 +clickIndex = -1 + +while running: + for event in pg.event.get(): + + if event.type == pg.MOUSEBUTTONDOWN: + clickType, clickIndex = getElemAt(pg.mouse.get_pos()) + + now = pg.time.get_ticks() + if now - last_click <= doubleClickDuration: + if clickType == -1: + pass + if clickType == 0: + print(nodes) + if clickIndex > 0: + if clickIndex < len(nodes)-1: + newPos = (nodes[clickIndex-1][0]+nodes[clickIndex][0])/2,(nodes[clickIndex-1][1]+nodes[clickIndex][1])/2 + curveEditPoints[clickIndex] = newPos + curveEditPoints.pop(clickIndex-1) + elif clickIndex == 0 and len(nodes) > 1: + curveEditPoints.pop(clickIndex) + # if len(nodes) != 1: + nodes.pop(clickIndex) + # else: nodes = [] + refresh() + + + else: + if clickType == -1: + singleClick() + last_click = pg.time.get_ticks() + + if event.type == pg.MOUSEMOTION and clickType != -1: + if clickType == 0: + nodes[clickIndex] = pg.mouse.get_pos() + if clickType == 1: + curveEditPoints[clickIndex] = pg.mouse.get_pos() + refresh() + + if event.type == pg.MOUSEBUTTONUP: + if clickType != -1: + clickType = -1 + clickIndex = -1 + + if event.type == pg.QUIT: + running = False +pg.quit()