4*4矩阵转换成二维平面坐标

一、需求:基于苹果数据4*4矩阵数据,转换成二维平面坐标系

二、解决方法与步骤:

用到的方法:

1、Matrix4的转化_Catirl的博客-CSDN博客

2、平面内直角坐标系中坐标旋转变换公式_Eric_Wangyz的博客-CSDN博客_坐标旋转变换公式

苹果数据效果:

{"windows" : [{"category" : {"window" : {}},"confidence" : {"medium" : {}},"dimensions" : [4.4304699897766113,2.4727039337158203,0],"completedEdges" : [],"parentIdentifier" : "B4002F3F-2741-405F-9A82-18FF65284C8C","identifier" : "70ABA8D4-0AA8-4404-940E-04309F358EBC","curve" : null,"transform" : [-0.30633658170700073,0,-0.95192313194274902,0,0,0.99999994039535522,0,0,0.9519231915473938,0,-0.30633658170700073,0,-3.3060400485992432,-0.20823472738265991,2.7119290828704834,1]}],"doors" : [{"category" : {"door" : {"isOpen" : false}},"confidence" : {"medium" : {}},"dimensions" : [1.0301132202148438,2.5737776756286621,0],"completedEdges" : [],"parentIdentifier" : "CC22237C-B6ED-44B5-8547-180A3A0E5994","identifier" : "B19AD43B-3C4D-4DA5-A5C0-34A1D39F5892","curve" : null,"transform" : [0.3063366711139679,0,0.95192307233810425,0,0,1,0,0,-0.95192307233810425,0,0.3063366711139679,0,0.90193623304367065,-0.24133116006851196,-0.033205278217792511,1]},{"category" : {"door" : {"isOpen" : false}},"confidence" : {"medium" : {}},"dimensions" : [1.0522669553756714,2.411841869354248,0],"completedEdges" : [],"parentIdentifier" : "CC22237C-B6ED-44B5-8547-180A3A0E5994","identifier" : "8095E4C9-2986-446E-9FC9-D92225777FBC","curve" : null,"transform" : [0.30633670091629028,0,0.95192313194274902,0,0,0.99999994039535522,0,0,-0.95192307233810425,0,0.3063366711139679,0,1.2751809358596802,-0.2488710880279541,1.1266312599182129,1]},{"category" : {"door" : {"isOpen" : true}},"confidence" : {"medium" : {}},"dimensions" : [0.79290330410003662,2.3365452289581299,0],"completedEdges" : [],"parentIdentifier" : "CC22237C-B6ED-44B5-8547-180A3A0E5994","identifier" : "717D86E1-F273-4577-85DF-E03B933D6188","curve" : null,"transform" : [0.30633661150932312,0,0.95192325115203857,0,0,1,0,0,-0.95192325115203857,0,0.30633661150932312,0,0.5105128288269043,-0.35994744300842285,-1.249530553817749,1]}],"walls" : [{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [5.6710019111633301,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "8D161454-7233-4E76-BC11-3E3186A8B6D6","identifier" : "B4002F3F-2741-405F-9A82-18FF65284C8C","curve" : null,"transform" : [-0.30633664131164551,0,-0.9519231915473938,0,0,0.99999994039535522,0,0,0.95192313194274902,0,-0.30633658170700073,0,-3.4495170116424561,-0.049728155136108398,2.2660825252532959,1]},{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [4.8466057777404785,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "5ADD04DA-13E7-4010-B381-D3307FFD5E46","identifier" : "F4BCF245-4442-422E-9894-177078F54AE0","curve" : null,"transform" : [0.9519231915473938,0,-0.30633658170700073,0,0,0.99999994039535522,0,0,0.30633652210235596,0,0.95192307233810425,0,-2.0113365650177002,-0.049728155136108398,-1.1754434108734131,1]},{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [4.1486597061157227,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "25A96F47-C12D-4EFE-B971-472089DF4594","identifier" : "4AD4A1DE-4257-49F2-B788-EAEE5223107C","curve" : null,"transform" : [-0.9519231915473938,0,0.30633658170700073,0,0,0.99999994039535522,0,0,-0.30633652210235596,0,-0.95192307233810425,0,0.18788377940654755,-0.049728155136108398,4.5193233489990234,1]},{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [0.69794571399688721,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "44C4678D-23CB-4C12-B6C4-762CB0452E60","identifier" : "74CA573A-F192-47E2-A262-EEF9CAF44E7E","curve" : null,"transform" : [-0.95192313194274902,0,0.30633693933486938,0,0,0.99999994039535522,0,0,-0.306336909532547,0,-0.95192307233810425,0,-2.2487037181854248,-0.049728155136108398,4.8583579063415527,1]},{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [0.4236811101436615,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "D510898F-31C8-4986-8A1C-9EE75CC68D91","identifier" : "4912B095-361F-4914-8F1A-FB2F9A0C3C94","curve" : null,"transform" : [-0.30633756518363953,0,-0.95192277431488037,0,0,0.99999994039535522,0,0,0.95192277431488037,0,-0.30633756518363953,0,-1.8516137599945068,-0.049728155136108398,4.9531106948852539,1]},{"category" : {"wall" : {}},"confidence" : {"high" : {}},"dimensions" : [6.0946831703186035,2.9569838047027588,0],"completedEdges" : [],"parentIdentifier" : "34D0C39D-D4D7-48B4-9DE0-7ACD7E6EFBB9","identifier" : "CC22237C-B6ED-44B5-8547-180A3A0E5994","curve" : null,"transform" : [0.30633670091629028,0,0.9519231915473938,0,0,0.99999994039535522,0,0,-0.95192313194274902,0,0.30633664131164551,0,1.2289738655090332,-0.049728155136108398,0.98304539918899536,1]}],"openings" : [],"objects" : [{"dimensions" : [1.5987249612808228,0.94955956935882568,0.065000005066394806],"confidence" : {"medium" : {}},"transform" : [0.95192325115203857,0,-0.30633643269538879,0,0,0.99999994039535522,0,0,0.30633637309074402,0,0.9519231915473938,0,-1.6764084100723267,-0.001988828182220459,-0.99941855669021606,1],"category" : {"television" : {}},"identifier" : "C3BEB09E-7408-42CE-8954-E87B355B4299"},{"dimensions" : [0.51159495115280151,1.0113105773925781,0.56274306774139404],"confidence" : {"medium" : {}},"transform" : [-0.95192283391952515,0,0.30633756518363953,0,0,1,0,0,-0.30633753538131714,0,-0.95192289352416992,0,-0.40752917528152466,-1.0225648880004883,3.9929168224334717,1],"category" : {"chair" : {}},"identifier" : "B8105472-71D6-417E-9E2C-F1155FB1F1F2"},{"dimensions" : [0.4749830961227417,0.40395355224609375,0.57471352815628052],"confidence" : {"medium" : {}},"transform" : [-0.95192235708236694,0,0.30633917450904846,0,0,1.0000001192092896,0,0,-0.30633923411369324,0,-0.95192247629165649,0,-0.55003666877746582,-1.3262432813644409,3.1927976608276367,1],"category" : {"chair" : {}},"identifier" : "2A7F638D-DAB2-4FAB-A4EA-FA0F9793390A"},{"dimensions" : [0.47498306632041931,0.40395355224609375,0.57471358776092529],"confidence" : {"medium" : {}},"transform" : [-0.30632853507995605,0,-0.95192575454711914,0,0,1.0000001192092896,0,0,0.95192593336105347,0,-0.30632859468460083,0,-1.6257414817810059,-1.3262432813644409,1.6771179437637329,1],"category" : {"chair" : {}},"identifier" : "0ED886B4-014C-47E9-B952-F868561FC3B0"},{"dimensions" : [0.52009981870651245,0.94679880142211914,0.57890421152114868],"confidence" : {"medium" : {}},"transform" : [0.21847167611122131,0,0.97584319114685059,0,0,0.99999988079071045,0,0,-0.97584307193756104,0,0.21847164630889893,0,1.4021255970001221,-1.0548207759857178,2.5414259433746338,1],"category" : {"chair" : {}},"identifier" : "5A194FF7-5D66-4FFA-9379-4B801234BA3A"},{"dimensions" : [3.7170906066894531,0.83971703052520752,1.2917746305465698],"confidence" : {"high" : {}},"transform" : [0.30633649230003357,0,0.9519231915473938,0,0,1.0000001192092896,0,0,-0.95192337036132812,0,0.30633652210235596,0,-1.0929687023162842,-1.1083616018295288,1.5056676864624023,1],"category" : {"table" : {}},"identifier" : "2524B480-8A47-4ED7-BD97-0A9C6ACE8A95"},{"dimensions" : [3.3376014232635498,2.3581094741821289,0.49721428751945496],"confidence" : {"medium" : {}},"transform" : [-0.95192277431488037,0,0.30633765459060669,0,0,1,0,0,-0.3063376247882843,0,-0.95192277431488037,0,-0.2743067741394043,-0.34916538000106812,4.4068951606750488,1],"category" : {"storage" : {}},"identifier" : "52E23C35-59C5-404B-A46F-DBDB2A5BECCC"}],"version" : 1
}

1、4*4矩阵转成二维:基于四维矩阵中心点,求两端点坐标

# 墙体信息for wall in json_data["walls"]:# 墙体中心坐标center_p = np.array([wall["transform"][-4], wall["transform"][-2]])length = wall["dimensions"][0]transform01 = abs(wall["transform"][10])if wall["transform"][10] < 0:transform02 = wall["transform"][8]else:transform02 = -wall["transform"][8]# 基于中心点与四维矩阵,获取起始点p1 = center_p + 0.5 * length * np.array([transform01, transform02])p2 = center_p - 0.5 * length * np.array([transform01, transform02])

2、平面坐标系转化

cos = abs(json_data["walls"][0]["transform"][10])
sin = -abs(json_data["walls"][0]["transform"][8])# # # 坐标翻转
x1 = p1[0] * cos - p1[1] * sin
y1 = p1[1] * cos + p1[0] * sin
p1 = Point2D(int(round(x1 * 1000, 0)), int(round(y1 * 1000, 0)))x2 = p2[0] * cos - p2[1] * sin
y2 = p2[1] * cos + p2[0] * sin
p2 = Point2D(int(round(x2 * 1000, 0)), int(round(y2 * 1000, 0)))

3、整合代码:

import json
from sympy.geometry import *PATH = r"D:\Desktop\room74.json"
f = open(PATH, 'rb')
j = json.load(f)
f.close()def get_start_end_point(center_p, length, transform01, transform02, cos, sin):# 基于中心点与四维矩阵,获取起始点p1 = center_p + 0.5 * length * np.array([transform01, transform02])p2 = center_p - 0.5 * length * np.array([transform01, transform02])# # # 坐标翻转x1 = p1[0] * cos - p1[1] * siny1 = p1[1] * cos + p1[0] * sinp1 = Point2D(int(round(x1 * 1000, 0)), int(round(y1 * 1000, 0)))x2 = p2[0] * cos - p2[1] * siny2 = p2[1] * cos + p2[0] * sinp2 = Point2D(int(round(x2 * 1000, 0)), int(round(y2 * 1000, 0)))return p1, p2def get_wall_points(json_data):# 获取墙所有的坐标点wall_p_list = []# 墙体信息cos = abs(json_data["walls"][0]["transform"][10])sin = -abs(json_data["walls"][0]["transform"][8])for wall in json_data["walls"]:# 墙体中心坐标center_p = np.array([wall["transform"][-4], wall["transform"][-2]])length = wall["dimensions"][0]transform01 = abs(wall["transform"][10])if wall["transform"][10] < 0:transform02 = wall["transform"][8]else:transform02 = -wall["transform"][8]p1, p2 = get_start_end_point(center_p, length, transform01, transform02, cos, sin)wall_p_list.extend([p1, p2])return wall_p_list# 获取墙所有的坐标点:
wall_points_list = get_wall_points(json_data)print(wall_points_list )

4、结果:

[[Point2D(760, -869), Point2D(-270, -869)], [Point2D(1989, -869), Point2D(937, -869)], [Point2D(-637, -869), Point2D(-1430, -869)]]

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

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

相关文章

C#操作Excel(1)Excel对象模型

Excel对象模型 &#xff08;.Net Perspective&#xff09; 本文主要针对在Visual Studio中使用C# 开发关于Excel的应用程序 本文的PDF下载地址&#xff1a;C#操作Excel2007.pdf 来源&#xff1a;Understandingthe Excel Object Model from a .NET Developers Perspective Exce…

蓝牙适配器 能同时接多少个设备_便携音箱也能有立体环绕声,JVC智能蓝牙颈挂音箱体验...

说起音箱&#xff0c;相信音乐爱好者是很熟悉了&#xff0c;而随着蓝牙技术的不断发展&#xff0c;便携式蓝牙音箱开始受到越来越多用户的喜爱&#xff0c;它能够让我们摆脱线材束缚&#xff0c;随时随地畅享音乐。虽然便携式蓝牙音箱小巧易携带&#xff0c;音质方面也在不断提…

LeetCode 1156. 单字符重复子串的最大长度

文章目录1. 题目2. 解题1. 题目 如果字符串中的所有字符都相同&#xff0c;那么这个字符串是单字符重复的字符串。 给你一个字符串 text&#xff0c;你只能交换其中两个字符一次或者什么都不做&#xff0c;然后得到一些单字符重复的子串。 返回其中最长的子串的长度。 示例 …

☆☆在Eclipse中编译NDK的so文件(普通安卓项目转换为NDK项目的设定)

1 将Native的编译链接配置加入项目中 2 进行编译 3 项目支持Native后&#xff0c;在首尾分别新增了两个编译过程 转载于:https://www.cnblogs.com/YangBinChina/p/3937287.html

小案例:利用图床自动化批量上传图片并获取图片链接

一、前言&#xff1a; 用python爬虫写了一个小脚本&#xff0c;用来自动上传图片到图床&#xff0c;然后返回链接&#xff0c;我们只需直接复制链接就可以。&#xff08;需要安装Requests库&#xff09;因为不同图床需要提交的POST表单不一致&#xff0c;所以在这里我用ImgURL…

LeetCode 497. 非重叠矩形中的随机点(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个非重叠轴对齐矩形的列表 rects&#xff0c;写一个函数 pick 随机均匀地选取矩形覆盖的空间中的整数点。 提示&#xff1a; 整数点是具有整数坐标的点。 矩形周边上的点包含在矩形覆盖的空间中。 第 i 个矩形 rects [i] [x1&#xff0…

win10蓝屏提示重新启动_电脑蓝屏五大要素,秒判蓝屏问题及处理!

电脑蓝屏是个老生常谈的问题&#xff0c;而蓝屏问题也是电脑问题中最为复杂的问题之一&#xff0c;别说电脑小白&#xff0c;就是电脑老鸟有时候面对蓝屏都会犯怵&#xff01;简单来说&#xff0c;电脑蓝屏就好像人类突然晕倒&#xff0c;或者最严重的情况直接死亡&#xff0c;…

小案例:利用Python获取Windows电脑WiFi密码

一、需求&#xff1a; 电脑上忘记wifi密码&#xff0c;直接用命令行便可查看所有的wifi密码 二、逻辑&#xff1a; 1、提取windows上所有的wifi名称 2、每一个wifi的信息存储在一个字典里 3、判断wifi密码是否存储在windows计算机里&#xff0c;不存在则忽略 4、密码存在…

sql 分页

1. top分页法 select top pageSize from tb where ID not in (select top pageSize*pageIndex from tb) select top pageSize from tb where ID > select Max(ID) from (select top pageSize*pageIndex from tb) as t 2. RowNum() select * from (select row_number() ove…

LeetCode 528. 按权重随机选择(前缀和+二分查找)

文章目录1. 题目2. 解题1. 题目 给定一个正整数数组 w &#xff0c;其中 w[i] 代表下标 i 的权重&#xff08;下标从 0 开始&#xff09;&#xff0c;请写一个函数 pickIndex &#xff0c;它可以随机地获取下标 i&#xff0c;选取下标 i 的概率与 w[i] 成正比。 例如&#xf…

boss直聘改回系统头像_BOSS 直聘找工作,消息却已读不回?| 在线求职5条避坑指南...

前几天在半撇私塾的求职群里&#xff0c;一个同学反馈&#xff1a;在 BOSS 直聘求职的时候&#xff0c;为什么总是被「已读不回」呢&#xff1f;就连逛豆瓣的上班小组&#xff0c;都能遇到这样的反馈&#xff1a;为什么会出现「已读不回」的情况呢&#xff1f;关于这个问题的答…

解决问题:Python调用cmd命令,出现中文乱码

一、前言&#xff1a; Python如何使用OS模块调用cmd 在os模块中提供了两种调用 cmd 的方法&#xff0c;os.popen() 和 os.system() os.system(cmd) 是在执行command命令时需要打开一个终端&#xff0c;并且无法保存command命令的执行结果。 os.popen(cmd,mode) 打开一个与c…

LeetCode 587. 安装栅栏 / LintCode 1152. 安装栅栏(凸包检测:排序+叉积正负判断+正反扫描+去重)

文章目录1. 题目2. 解题1. 题目 在一个二维的花园中&#xff0c;有一些用 (x, y) 坐标表示的树。 由于安装费用十分昂贵&#xff0c;你的任务是先用最短的绳子围起所有的树。 只有当所有的树都被绳子包围时&#xff0c;花园才能围好栅栏。 你需要找到正好位于栅栏边界上的树的…

arduino读取水位传感器的数据显示在基于i2c的1602a上_XSB-IC-S2智能水位监测仪-老友网...

XSB-IC-S2智能水位监测仪 多功能本身就是智能仪器仪表的一个特点。例如&#xff0c;为了设计速度较快和结构较复杂的数字系统&#xff0c;仪器生产厂家制造了具有脉冲发生器、频率合成器和任意波形发生器等功能的函数发生器。这种多功能的综合型产品不但在性能上(如准确度)比专…

七夕小案例:用代码给心爱的她画一个爱心

一、爱心示例&#xff1a; 二、开始写代码&#xff1a; /* * Hi。宝贝&#xff01; * 这么久了。还没和宝贝说过我的工作呢&#xff01; * 我是个前端工程师。俗称程序员。网页相关。 * 如这个页面。就是个什么也没有的网页。 * 我的工作就是给这种空白的页面加点儿东西。 * 嗯…

在asp.net 2.0中使用SqlBulkCopy类迁移数据

在asp.net 2.0中使用SqlBulkCopy类迁移数据 (转&#xff09; http://jackyrong.cnblogs.com/archive/2005/08/29/225521.html 我们经常要在一个表中将数据迁移到另一个表&#xff0c;当然&#xff0c;用的方法十分多了。在.net 2.0中&#xff0c;提供了一个sqlbulkcopy类&#…

小案例:13行python代码实现对微信进行推送消息

一、前言&#xff1a; Python可以实现给QQ邮箱、企业微信、微信等等软件推送消息&#xff0c;今天咱们实现一下Python直接给微信推送消息。 这里咱们使用了一个第三方工具pushplus 二、单人推送 实现步骤&#xff1a; 1、用微信注册一个此网站的账号 2、将token复制出来&am…

python书籍_Python书籍大汇总——入门到实战

学习Python的朋友们越来越多&#xff0c;当当网和京东上面的Python类编程书籍&#xff0c;也从几年前寥寥无几到现在多的不知道选哪本才好了的地步。无论是自学还是参加培训班跟着老师学习&#xff0c;我们都需要几本实用的Python书&#xff0c;系统全面的掌握Python编程的相关…

LeetCode 87. 扰乱字符串(记忆化递归 / DP)

文章目录1. 题目2. 解题2.1 记忆化递归2.2 动态规划1. 题目 给定一个字符串 s1&#xff0c;我们可以把它递归地分割成两个非空子字符串&#xff0c;从而将其表示为二叉树。 下图是字符串 s1 “great” 的一种可能的表示形式。 great/ \gr eat/ \ / \ g r e a…

信号量的分类

信号量的分类Mutual Exclusion Semaphores&#xff08;互斥&#xff09;&#xff1a;一种特殊的二进制信号量&#xff0c;专门针对互斥操作进行了优化。Binary Semaphores&#xff08;二进制&#xff09;&#xff1a;完成互斥、同步操作的最佳方式&#xff1b;速度最快&#xf…