查找以椭圆为界的最大面积的等腰三角形的坐标

Find coordinates of isosceles triangle with maximum area bounded by ellipse

从数学溢出“重定向”到这里: https://mathoverflow.net/questions/372704/find-coordinates-of-isosceles-triangle-with-maximum-area-bounded-by-ellipse

我有一个 window,里面刻有一个椭圆。椭圆半径为 screen_width / 2 和 screen_height / 2。我想找到适合椭圆且不会溢出的最大等腰三角形的坐标。

三角形尖端的方向是枚举参数(即 N、E、S、W)。据我所知,没有唯一的解决方案,但最大面积是一个简单的公式,并且有一种方法可以找到解决问题的三角形。不过这种方式只是暗示而已,可能涉及用线性代数将日食和等腰三角形归一化为单位圆和等边三角形,但网上似乎没有这样的公式。

圆内切等边三角形是圆的最大面积所覆盖的三角形(某个定理你要查查)

椭圆是一个“压扁”的圆,因此,如果我们压扁一个带有内接等边三角形的圆,前提是我们沿着一条对称线这样做,我们最终会得到一个最大面积 等腰 三角形(两条边按公因数调整大小,第三条边按另一个因数拉伸)。

角度遵循 inscribed angle theorem and complementary angle theorem

考虑到你的屏幕宽大于高,三角形3个顶点的坐标如下(屏幕坐标,原点在左上角)

top: (w/2, 0)  # this one does not change
bot_left = (w/2 - w*cos(pi/6)/2, h/2 + h*sin(pi/6)/2) 
bot_right = (w/2 + w*cos(pi/6)/2, h/2 + h*sin(pi/6)/2) 

添加到@Reblochon 的回答,这是一个完整的例子。我试过了,为什么不分享呢:)

import pygame
from math import sin, cos, pi
pygame.init()

SW = 600
SH = 600
WIN = pygame.display
D = WIN.set_mode((SW, SH))

radiiX = SW/2
radiiY = SH/2

def ellipse(center, rx, ry):
    global gotPositions
    angle = 0
    while angle < 6.28:
        angle += 0.0005

        pygame.draw.circle(D, (255, 255, 0), (int(center[0]), int(center[1])), 2)
        x = center[0] + sin(angle)* radiiX
        y = center[1] + cos(angle)* radiiY
        D.set_at((int(x), int(y)), (255, 255, 0))

top= (SW/2, 0)  # this one does not change
bot_left = (SW/2 - SW*cos(pi/6)/2, SH/2 + SH*sin(pi/6)/2) 
bot_right = (SW/2 + SW*cos(pi/6)/2, SH/2 + SH*sin(pi/6)/2)

points = [top, bot_left, bot_right]

while True:
    D.fill((0, 0, 0))
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            pygame.quit()

    ellipse([radiiX, radiiY], radiiX, radiiY)
    pygame.draw.lines(D, (255, 255, 0), True, points)
    
    pygame.display.flip()

基于 Reblochon Masque 的笔记

def inner_rect (self):
        rect = self.outer_rect ()             # bounding box of ellipse
        x, y, w, h = rect
        r = self.child.orientation.radians () # direction of triangle
        pts = inscribe_polygon (3, r)
        pts = graphics_affines (pts)          # from cartesian
        pts = scale_points (pts, rect)        # scale points to ellipse dims
        o, r = bounding_rect (pts)
        xmin, ymin = o
        dx, dy = r
        return (xmin, ymin, dx, dy)