| import type { PPTElement } from '@/lib/types/slides'; |
| import type { PercentageGeometry } from '@/lib/types/action'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| export function getElementPercentageGeometry( |
| element: PPTElement, |
| viewportSize: number = 1000, |
| ): PercentageGeometry | null { |
| |
| if ( |
| !('left' in element) || |
| !('top' in element) || |
| !('width' in element) || |
| !('height' in element) |
| ) { |
| return null; |
| } |
|
|
| const { left, top, width, height } = element; |
|
|
| |
| const x = (left / viewportSize) * 100; |
| const y = (top / (viewportSize * 0.5625)) * 100; |
| const w = (width / viewportSize) * 100; |
| const h = (height / (viewportSize * 0.5625)) * 100; |
|
|
| |
| const centerX = x + w / 2; |
| const centerY = y + h / 2; |
|
|
| return { |
| x, |
| y, |
| w, |
| h, |
| centerX, |
| centerY, |
| }; |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export function findElementGeometry( |
| |
| scene: Record<string, any>, |
| elementId: string, |
| viewportSize: number = 1000, |
| ): PercentageGeometry | null { |
| |
| |
| |
| let elements: PPTElement[] | undefined; |
|
|
| if (scene.type === 'slide') { |
| if (scene.elements) { |
| |
| elements = scene.elements; |
| } else if (scene.content?.canvas?.elements) { |
| |
| elements = scene.content.canvas.elements; |
| } |
| } |
|
|
| if (!elements) { |
| return null; |
| } |
|
|
| const element = elements.find((el: PPTElement) => el.id === elementId); |
| if (!element) { |
| return null; |
| } |
|
|
| return getElementPercentageGeometry(element, viewportSize); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| export function findNearestCorner(geometry: PercentageGeometry): { |
| x: number; |
| y: number; |
| } { |
| const { centerX, centerY } = geometry; |
|
|
| |
| const corners = [ |
| { x: 0, y: 0 }, |
| { x: 100, y: 0 }, |
| { x: 0, y: 100 }, |
| { x: 100, y: 100 }, |
| ]; |
|
|
| |
| let minDistance = Infinity; |
| let nearestCorner = corners[0]; |
|
|
| for (const corner of corners) { |
| const distance = Math.sqrt(Math.pow(corner.x - centerX, 2) + Math.pow(corner.y - centerY, 2)); |
| if (distance < minDistance) { |
| minDistance = distance; |
| nearestCorner = corner; |
| } |
| } |
|
|
| return nearestCorner; |
| } |
|
|