python矢量算法-三角形变化寻找对应点

1.算法需求描述

现有随机生成的两个三角形A与B,在三角形A中存在Pa,使用算法计算出三角形B中对应的点Pb

2.python代码

import numpy as np  
  
# 计算三角形A的面积  
def area_triangle(vertices):  
    return 0.5 * np.abs(np.dot(vertices[0] - vertices[1], vertices[1] - vertices[2]))  
  
# 计算重心坐标  
def barycentric_coordinates(P, vertices):  
    v0 = vertices[1] - vertices[0]  
    v1 = vertices[2] - vertices[0]  
    v2 = P - vertices[0]  
      
    d00 = np.dot(v0, v0)  
    d01 = np.dot(v0, v1)  
    d11 = np.dot(v1, v1)  
    d20 = np.dot(v2, v0)  
    d21 = np.dot(v2, v1)  
      
    denom = d00 * d11 - d01 * d01  
    v = (d11 * d20 - d01 * d21) / denom  
    w = (d00 * d21 - d01 * d20) / denom  
    u = 1.0 - v - w  
      
    return np.array([u, v, w])  
def generate_random_triangle():
    # 随机生成三个点作为三角形的顶点
    vertices = np.random.rand(3, 2)  # 生成三个点,每个点有两个坐标值
    return vertices
def generate_random_point_in_triangle(triangle):
    # 生成两个随机数
    r1, r2 = np.random.rand(2)

    # 通过重心坐标法生成点
    sqrt_r1 = np.sqrt(r1)
    u = 1 - sqrt_r1
    v = r2 * sqrt_r1
    w = 1 - u - v

    # 计算点的坐标
    point = u * triangle[0] + v * triangle[1] + w * triangle[2]

    return point
import matplotlib.pyplot as plt

# 定义三角形的三个顶点坐标  
source_A = generate_random_triangle()
target_B = generate_random_triangle()

# 定义点P在三角形A内的坐标  
PA = generate_random_point_in_triangle(source_A) 

# 计算点P在三角形A中的重心坐标  
PA_coords = barycentric_coordinates(PA, source_A)  
  
# 使用重心坐标在三角形B中找到对应的点Pt  
PB = PA_coords[0] * target_B[0] + PA_coords[1] * target_B[1] + PA_coords[2] * target_B[2]  
  
print("Pt的坐标是:", PB)


# 绘制图形
plt.figure(figsize=(8, 6))

# 绘制A_arr构成的平面
plt.fill([point[0] for point in source_A], [point[1] for point in source_A], color='blue', alpha=0.2, label='A_arr Plane')

# 绘制B_arr中的点
plt.fill([point[0] for point in target_B], [point[1] for point in target_B], color='red', label='B_arr Points')

# 绘制source_P和target_P
plt.scatter(PA[0], PA[1], color='green', marker='o', label='Source Point')
plt.scatter(PB[0], PB[1], color='orange', marker='o', label='Target Point')

# 标记顶点顺序
for i, point in enumerate(source_A):
    plt.text(point[0], point[1], str(i + 1), fontsize=12, color='black', ha='right', va='bottom')
    
for i, point in enumerate(target_B):
    plt.text(point[0], point[1], str(i + 1), fontsize=12, color='black', ha='right', va='bottom')

plt.xlabel('X')
plt.ylabel('Y')
plt.title('Visualization of Points and Plane')
plt.legend()
plt.grid(True)
plt.show()

3.计算结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/479218.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用python爬取CSDN博客的总字数

一、下载pycahrm 此处推荐博客:PyCharm安装教程,图文教程(超详细)-CSDN博客 二、安装相应的库 pycharm安装库的步骤: 1、打开pycharm; 2、在菜单栏中,选择 "file">"setti…

d3dcompiler43.dll缺失怎么修复,教你五个方法快速搞定

在数字世界的深渊中,有一个名为d3dcompiler_43.dll的神秘文件,它就像一把打开现代科技之门的钥匙。这个文件是DirectX 12的一部分,由微软公司开发,用于编译和处理图形数据。 d3dcompiler_43.dll是一个动态链接库(DLL&…

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和

代码随想录算法训练营第三十一天 | 455. 分发饼干、376. 摆动序列、53. 最大子数组和 455. 分发饼干题目解法 376. 摆动序列题目解法 53. 最大子数组和题目解法 感悟 455. 分发饼干 题目 解法 class Solution { public:int findContentChildren(vector<int>& g, vec…

AcWing 1250. 格子游戏 (并查集,坐标变换)

记录此题的目的&#xff1a; 明确二维的坐标可以映射到一维&#xff1a;在x和y都是从0开始的前提下&#xff0c;假如图形列数为n&#xff0c;(x,y)映射到一维可以写成x * n y。并查集并不好存储二维数据&#xff0c;如果遇到二维数据可以将其映射到一维。 Alice和Bob玩了一个…

Amazon Bedrock 实践 | 动手玩转 Claude 3

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发&#xff0c;本篇为…

Spring:面试八股

文章目录 参考Spring模块CoreContainerAOP 参考 JavaGuide Spring模块 CoreContainer Spring框架的核心模块&#xff0c;主要提供IoC依赖注入功能的支持。内含四个子模块&#xff1a; Core&#xff1a;基本的核心工具类。Beans&#xff1a;提供对bean的创建、配置、管理功能…

第十三届蓝桥杯省赛真题 Java B 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 星期计算试题 B: 山试题 C: 字符统计试题 D: 最少刷题数试题 E \mathrm{E} E : 求阶乘试题 F : \mathrm{F}: F: 最大子矩阵试题 G: 数组切分试题 H: 回忆迷宫试题 I: 红绿灯试题 J 拉箱子 发现宝藏 前些天发现了一个巨牛的人工智能学习…

C++ 侯捷 程序设计(Ⅱ)兼谈对象模型 笔记

Conversion function 转换函数 侯捷老师使用分数 Fraction举例&#xff0c;分数理应可以被看作是小数 提供了Fraction类对象一个转换为double的方法&#xff0c;当碰到需要转换为double的情况下&#xff0c;会调用该方法。 黄色的就是转换函数&#xff0c;没有return type&am…

【免费】基于扩展(EKF)和无迹卡尔曼滤波(UKF)的电力系统动态状态估计

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序对应文章《Power System Dynamic State Estimation Using Extended and Unscented Kalman Filters》&#xff0c;电力系统状态的准确估计对于提高电力系统的可靠性、弹性、安全性和稳定性具有重要意义&a…

RIPGeo代码理解(五)utils.py( 辅助函数)第一部分

​ 代码链接:RIPGeo代码实现 ├── lib # 包含模型(model)实现文件 │ |── layers.py # 注意力机制的代码。 │ |── model.py # TrustGeo的核心源代码。 │ |── sublayers.py # layer.py的支持文件。 │ |── utils.p…

详解Python的函数嵌套

Python语言允许在定义函数的时候&#xff0c;其函数体内又包含另外一个函数的完整定义&#xff0c;这就是我们通常所说的嵌套定义。 实例1&#xff1a; def OutFun(): #定义函数OutFun()&#xff0c;m3 #定义变量m3;def InFun(): #在OutFun内定义函…

python学生作业管理系统flask-django-nodejs-php

课题主要分为三大模块&#xff1a;即管理员模块和学生、教师模块&#xff0c;主要功能包括&#xff1a;学生、教师、作业信息、学习模块、教学评价、学习情况等&#xff1b; 关键词&#xff1a;学生作业管理系统&#xff1b;作业信息 目录 摘 要 I Abstrac II 目录 III 1绪论 1…

jmeter接口导入方式

curl直接导入 1、操作页面后&#xff0c;F12查看接口&#xff0c;右击接口-copy-copy as cURL 2、jmeter 工具-import from cURL&#xff0c;粘贴上面复制的curl 根据接口文档导入 1、接口文档示例如下&#xff1a; Path&#xff1a; /api/jobs/xps/exec Method&#xf…

图像几何变换(仿射变换和透视变换...)及python-opencv实现

文章目录 图像变换类型仿射变换透视变换python-opencv实现参考文献 图像变换类型 图像几何变换主要包括以下几种类型&#xff1a; 平移&#xff08;Translation&#xff09;&#xff1a;将图像在水平或垂直方向上移动&#xff0c;不改变图像的尺寸和形状。缩放&#xff08;Sca…

理解静态库、动态库加载

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 系统角度理解 我们先来谈谈进程地址空间&#xff0c;当我们将一个可执行程序跑起来的时候&#xff0c;操作系统首先会在内存中创建出task_struct&#xff0c;也就是进程控制块&#xff0c;然后将可执行程序的代码和数据加载…

整数和浮点数在内存中存储

整数在内存中的存储 整数的2进制表⽰⽅法有三种&#xff0c;即原码、反码和补码。 对于整形来说&#xff0c;数据存放内存中的其实是补码。 在计算机系统中&#xff0c;数值一律用补码来表示和存储。原因是&#xff0c;使用补码&#xff0c;可以使符号位和数值域统一处理&am…

ARMday7

VID_20240322_203313 1.思维导图 2.main.c #include"key_inc.h" //封装延时函数 void delay(int ms) {int i,j;for(i0;i<ms;i){for(j0;j<2000;j){}} } int main() {//按键中断的初始化key1_it_config();key2_it_config();key3_it_config();while(1){printf(&q…

备战蓝桥杯Day34 - 每日一题

题目描述 解题思路 1.输入数据n&#xff0c;并将字符串类型转换成整数类型 2.求出输入n是2的几次幂&#xff08;调用math库中的求对数的方法&#xff09;&#xff0c;在下面的循环中要用到 3.定义sum和&#xff0c;将抽取到的牌的总数加起来存储 4.count 0 # 记录 2 的第几…

台达变频通过Modbus转Profinet网关可以在环网冗余中使用

Modbus转Profinet网关&#xff08;如XD-MDPN100&#xff09;是一种能够实现Modbus协议与Profinet协议之间转换的设备。它支持Modbus RTU协议和Profinet协议还支持MRP环网冗余系统&#xff0c;,可以通过配置软件进行协议转换&#xff0c;使得原本只能使用Modbus协议的设备可以与…

微服务day05(中) -- ES索引库操作

索引库就类似数据库表&#xff0c;mapping映射就类似表的结构。 我们要向es中存储数据&#xff0c;必须先创建“库”和“表”。 2.1.mapping映射属性 mapping是对索引库中文档的约束&#xff0c;常见的mapping属性包括&#xff1a; type&#xff1a;字段数据类型&#xff0c;…