pygame三角形重心坐标应用 判断点是否在三角形内

综上,我们可以得出,当PP的重心坐标的三个值都属于[0, 1][0,1]区间,则PP点在三角形内
参考参考
参考

比如,重心的重心坐标为(1/3, 1/3, 1/3),含义就是重心将原三角形分割成的 3 个小三角形,每个占总面积的三分之一。这样理解重心坐标,就很容易理解:为什么三角形内的点,重心坐标之和为 1。因为 3 个小三角形面积相加,显然等于大三角形的面积。
比如,重心的重心坐标为(1/3, 1/3, 1/3),含义就是重心将原三角形分割成的 3 个小三角形,每个占总面积的三分之一。这样理解重心坐标,就很容易理解:为什么三角形内的点,重心坐标之和为 1。因为 3 个小三角形面积相加,显然等于大三角形的面积。

那么当点位于三角形外呢?那么面积就会出现负值,所以重心坐标就至少有一个是负数,但总和仍然是 1。
参考
参考

参考
添加链接描述
在这里插入图片描述
在这里插入图片描述

zx =230 #(ax + bx + cx) / 3
zy =190#(ay + by + cy) / 3
‘’’
x,y=500 abc三点不满足大于0小于1
-0.7076923076923077
1.3282051282051281
0.3794871794871797
1.0

x,y=143 都满足大于0小于1,在三角形内
0.94 0.04666666666666667 0.013333333333333384 1.0

x,y=300 都满足,在三角形内
0.2153846153846154 0.6102564102564103 0.1743589743589743 1.0

x,y=0 不满足,不在三角形内
1.6 -0.4666666666666667 -0.13333333333333341 0.9999999999999999

x=770,y=143 不满足 不在三角形内
-0.6676923076923077 -1.0251282051282051 2.692820512820513 1.0

 x=230,y=190满足,在
 0.6205128205128205 0.147008547008547 0.23247863247863246 1.0
'''

za1=-(zx-bx)*(cy-by)+(zy-by)*(cx-bx)
za2=-(ax-bx)*(cy-by)+(ay-by)*(cx-bx)
zhongxina=za1/za2

zb1=-(zx-cx)*(ay-cy)+(zy-cy)*(ax-cx)
zb2=-(bx-cx)*(ay-cy)+(by-cy)*(ax-cx)
zhongxinb=zb1/zb2

zhongxinc=1-zhongxina-zhongxinb
print(zhongxina,zhongxinb,zhongxinc,zhongxina+zhongxinb+zhongxinc,"zx,",zx,"zy",zy)
import pygame
from pygame.locals import *
import sys
import math

pygame.init()

width, height = 800, 600
screen = pygame.display.set_mode((width, height))

vertices = [(100, 100, 1), (400, 600, 1), (800, 100, 1)]

angle = 0
rotation_speed = 2  # 可根据需要调整旋转速度
c=pygame.time.Clock()
f=False
suofang=100
ax=0
ay=0
bx=0
by=0
cx=0
cy=0

ci=0
zx=0
zy=0
zhongxina=0
zhongxinb=0
zhongxinc=0
def rotate_point(point, angle):
    x, y, z = point
    new_x = x * math.cos(math.radians(angle)) - z * math.sin(math.radians(angle))
    new_z = x * math.sin(math.radians(angle)) + z * math.sin(math.radians(angle))
    return (new_x, y, new_z)

def draw_triangle(vertices):
    #points = [rotate_point(vertex, angle) for vertex in vertices]
    global ci
    global ax
    global ay
    global bx
    global by
    global cx
    global cy
    points = []
    for vertex in vertices:
        rotated_vertex = rotate_point(vertex, angle)
        points.append(rotated_vertex)
    #pygame.draw.polygon(screen, (255, 0, 0), [(width/2 + p[0], height/2 - p[1]) for p in points])
    transformed_points = []
    for p in points:
        if ci==0:

            ax=p[0]*30/suofang +100 # 将x坐标用透视投影在屏幕上
            ay=p[1]*30/suofang +100# 将y坐标用透视投影在屏幕上
            transformed_points.append((ax, ay))  # 将转换后的坐标添加到列表中
            #print(']]',0)
        if ci==1:
            bx=p[0]*30/suofang +200# 将y坐标用透视投影在屏幕上
            by=p[1]*30/suofang +200# 将y坐标用透视投影在屏幕上
            transformed_points.append((bx, by))  # 将转换后的坐标添加到列表中
            #print("]",1)
        if ci==2:
            cx=p[0]*30/suofang +200# 将y坐标用透视投影在屏幕上
            cy=p[1]*30/suofang +200# 将y坐标用透视投影在屏幕上
            transformed_points.append((cx, cy))  # 将转换后的坐标添加到列表中
            #print("]",2)
        # x = p[0]*30/suofang +300 # 将x坐标用透视投影在屏幕上
        # y =  p[1]*30/suofang +200# 将y坐标用透视投影在屏幕上
        #transformed_points.append((x, y))  # 将转换后的坐标添加到列表中
        if (ci>=2):
            ci=0
        else:
            ci=ci+1
        #print(p,';;')
    # 绘制多边形
    #pygame.draw.polygon(screen, (200, 200, 200), transformed_points)
    print(transformed_points)


while True:
    screen.fill((255, 255, 255))
    c.tick(70)
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        keys = pygame.key.get_pressed()
        if keys[pygame.K_UP]:
            f = True

        if event.type == pygame.KEYUP:
            f = False
    if f==True:
        suofang=suofang-1
    draw_triangle(vertices)
    #angle += rotation_speed
    print("....","ax",ax ,"ay",ay,"bx",bx,"by",by,"cx",cx,"cy",cy)

    zx =(ax + bx + cx) / 3
    zy =(ay + by + cy) / 3
    '''
    x,y=500  abc三点不满足大于0小于1
    -0.7076923076923077
    1.3282051282051281
    0.3794871794871797
    1.0
    
    x,y=143 都满足大于0小于1,在三角形内
    0.94 0.04666666666666667 0.013333333333333384 1.0
    
    x,y=300 都满足,在三角形内
    0.2153846153846154 0.6102564102564103 0.1743589743589743 1.0
    
    x,y=0 不满足,不在三角形内
    1.6 -0.4666666666666667 -0.13333333333333341 0.9999999999999999
    
    x=770,y=143 不满足 不在三角形内
    -0.6676923076923077 -1.0251282051282051 2.692820512820513 1.0
    
     x=230,y=190满足,在
     0.6205128205128205 0.147008547008547 0.23247863247863246 1.0
    '''
    za1=-(zx-bx)*(cy-by)+(zy-by)*(cx-bx)
    za2=-(ax-bx)*(cy-by)+(ay-by)*(cx-bx)
    zhongxina=za1/za2

    zb1=-(zx-cx)*(ay-cy)+(zy-cy)*(ax-cx)
    zb2=-(bx-cx)*(ay-cy)+(by-cy)*(ax-cx)
    zhongxinb=zb1/zb2

    zhongxinc=1-zhongxina-zhongxinb
    print(zhongxina,zhongxinb,zhongxinc,zhongxina+zhongxinb+zhongxinc,"zx,",zx,"zy",zy)
    pygame.Surface.set_at(screen, (int(zx), int(zy)),
                          (190, 90, 90))
    pygame.display.flip()
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值