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_r1v = r2 * sqrt_r1w = 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.计算结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据架构设计

本博客地址:https://security.blog.csdn.net/article/details/136657478 一. 基本概念 1、解决传统数据架构无法及时响应用户请求的常用解决方法: ● 增加异步处理队列,通过工作处理层批量处理异步处理队列中的数据修改请求。 ● 建立数据库…

策略分析是什么?一文说清策略分析的方方面面!附10款策略分析必备模板!

在日益激烈的商业竞争环境中,有效的策略分析不仅能帮助企业全面了解自身的优势与劣势,同时也能提供决策制定的关键依据。一个优质的策略分析报告能帮助企业从宏观与微观两个层面洞察市场动态,掌握竞争对手信息,以及制定未来的战略…

C语言复杂度(个人笔记)

时间复杂度主要衡量一个算法的运行快慢. 空间复杂度主要衡量一个算法运行所需要的额外空间. 时间复杂度 算法中的基本操作的执行次数,为算法的时间复杂度. 只需要大概执行次数,我们使用大O的渐进表示法。(看谁对数学表达式的影响最大) 空间复杂度 是…

2.Redis有五种主要的数据类型

Redis有五种主要的数据类型 String(字符串):String类型是最简单的数据类型,可以存储任意类型的数据,例如整数、浮点数、字符串等。String类型支持一些基本的操作,如设置值、获取值、增减值等。 Hash&#…

杂记8---多线激光雷达与相机外参标定

背景:本人开源的标定程序,提供大家参考学习 基于棋盘格的多线激光雷达和鱼眼/针孔模型相机外参标定的程序 前言 标定数据,只需要一个棋盘格标定板。把标定板放置lidar 与camera 共视区域,拜拍几个pose进行采集。 基于简谐原则…

webpack5零基础入门-12搭建开发服务器

1.目的 每次写完代码都需要手动输入指令才能编译代码,太麻烦了,我们希望一切自动化 2.安装相关包 npm install --save-dev webpack-dev-server 3.添加配置 在webpack.config.js中添加devServer相关配置 /**开发服务器 */devServer: {host: localhos…

布隆过滤器原理介绍和典型应用案例

整理自己过去使用布隆过滤器的应用案例和理解 基本介绍 1970年由布隆提出的一种空间效率很高的概率型数据结构,它可以用于检索一个元素是否在一个集合中,由只存0或1的位数组和多个hash算法, 进行判断数据 【一定不存在或者可能存在的算法】 如果这些…

内容检索(2024.03.22)

随着创作数量的增加,博客文章所涉及的内容越来越庞杂,为了更为方便地阅读,后续更新发布的文章将陆续在此汇总并附上原文链接,感兴趣的小伙伴们可持续关注文章发布动态! 本期更新内容: 1. 真实案例分享--E…

C#,人工智能,机器学习,聚类算法,训练数据集生成算法、软件与源代码

摘要:本文简述了人工智能的重要分支——机器学习的核心算法之一——聚类算法,并用C#实现了一套完全交互式的、可由用户自由发挥的,适用于聚类算法的训练数据集生成软件——Clustering。用户使用鼠标左键(拖动)即可生成任意形状,任意维度,任意簇数及各种数据范围的训练数…

【python】flask请求钩子,主动抛出异常与异常捕获

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

综合实验---Web---进阶版

目录 实验配置: 1.PHP调整主配置文件时,修改文件内容 1.原内容调整(在编译安装的情况下) 2.调整如下 3.没有调整的,根据之前配置就行 2.配置Nginx支持PHP解析 1.原内容如下 2.调整如下 3.验证PHP测试页 1.原内容如下 2.调整如下 4…

Vant4:自动导入样式无效问题

今天前端小伙伴使用了Vant4,发现了一个奇怪的问题:按照Vant官方文档,按需引入组件样式(Vite 的项目): 安装插件 # 通过 npm 安装 npm i vant/auto-import-resolver unplugin-vue-components unplugin-aut…

Linux——du, df命令查看磁盘空间使用情况

一、实现原理: df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目…

金融知识分享系列之:支撑阻力

金融知识分享系列之:支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素: 锚定效应订单驱动 支撑阻力原理: 市…

产品经理面试如何自我介绍?

金三银四求职季,你是不是也有面试的冲动!但面试并不是头脑一热就能取得好结果,在此之前,必须得有周全的准备,才能应对好面试官的“连环问”! 所以,今天这篇产品经理面试干货文章,别…

数据结构--链表刷题(一)快慢指针

1.快慢指针 先看一道简单的题目:返回中间结点 这道题有一个最朴素的做法就是先遍历一边链表,设置计数器求出链表长度,再重新走1/2的链表长度,即可返回中间节点 // 第二种解法 //这种解法需要遍历两次链表ListNode cur1 head;int…

Git基础(24):分支回退

前言 将分支回退到之前的某个版本 开发中,可能开发某个功能不需要了,或者想要回退到之前历史的某个commit, 放弃后来修改的内容。 放弃已修改的内容 如果未提交,直接使用 git revert分支回退到指定commit 操作前的分支网络图…

Git版本管理--远程仓库

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: 重学Git-Git远程仓库管理_git remote add origin-CSDN博客 Git学习笔记&am…

【数据结构】选择排序

大家好,我是苏貝,本篇博客带大家了解选择排序,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 基本思想二. 直接选择排序 一. 基本思想 每一次从待排序的数据元素中选出最小&#xff…

【GPT概念-03】:人工智能中的注意力机制

说明 注意力机制生成分数(通常使用输入函数),确定对每个数据部分的关注程度。这些分数用于创建输入的加权总和,该总和馈送到下一个网络层。这允许模型捕获数据中的上下文和关系,而传统的固定序列处理方法可能会遗漏这…