鱼C论坛

 找回密码
 立即注册
查看: 3205|回复: 14

[已解决]射线和矩形的交点

[复制链接]
发表于 2023-3-5 16:16:02 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 鱼cpython学习者 于 2023-3-15 19:30 编辑

矩形没有旋转,四条边都和坐标轴平行或者垂直
射线从原点出发
射线与矩形不一定有交点,必须先进行检测

给出矩形左上角的顶点(x, y)和长宽width, height,射线与x轴正半轴的夹角angle,求射线与矩形的交点,并返回离原点最近的那一个点的坐标
目前我的方法是分别检测四条边和射线的交点,求出所有的点后再取和原点距离最近的点
有没有不用每条边都检测一遍的方法?
附加:矩形可以在任何地方,可以跨象限,可以某条边与坐标轴重合;angle的取值范围是0~360

编辑:
似乎有很多人读不懂我的题,我也觉得我的题目有点抽象了
这有个例子:一个子弹从原点射出,击中一堵墙,求子弹击中的那个点的坐标。墙的两条边平行于y轴,两条边平行于x轴
最佳答案
2023-3-5 16:16:03
不是很明白你的题目,像下面的图那样吗?
矩形.jpg
from math import tan, radians

slope = lambda angle: round(tan(radians(angle)), 10)
f = lambda k, x: k * x
g = lambda k, y: y / k

x, y = 1, 6
w, h = 6, 3
angle = 45

top = y
bottom = y - h
left = x
right = x + w

if f(slope(angle), top) >= left and f(slope(angle), top) <= right:
    print(f"({int(f(slope(angle), top))}, {top})")
if f(slope(angle), bottom) >= left and f(slope(angle), bottom) <= right:
    print(f"({int(f(slope(angle), bottom))}, {bottom})")
if g(slope(angle), left) >= bottom and g(slope(angle), left) <= top:
    print(f"({left}, {int(f(slope(angle)), left)})")
if g(slope(angle), right) >= bottom and g(slope(angle), right) <= top:
    print(f"({right}, {int(f(slope(angle), right))})")
(6, 6)
(3, 3)

最佳答案

查看完整内容

不是很明白你的题目,像下面的图那样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-5 16:16:03 | 显示全部楼层    本楼为最佳答案   
不是很明白你的题目,像下面的图那样吗?
矩形.jpg
from math import tan, radians

slope = lambda angle: round(tan(radians(angle)), 10)
f = lambda k, x: k * x
g = lambda k, y: y / k

x, y = 1, 6
w, h = 6, 3
angle = 45

top = y
bottom = y - h
left = x
right = x + w

if f(slope(angle), top) >= left and f(slope(angle), top) <= right:
    print(f"({int(f(slope(angle), top))}, {top})")
if f(slope(angle), bottom) >= left and f(slope(angle), bottom) <= right:
    print(f"({int(f(slope(angle), bottom))}, {bottom})")
if g(slope(angle), left) >= bottom and g(slope(angle), left) <= top:
    print(f"({left}, {int(f(slope(angle)), left)})")
if g(slope(angle), right) >= bottom and g(slope(angle), right) <= top:
    print(f"({right}, {int(f(slope(angle), right))})")
(6, 6)
(3, 3)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-5 21:20:12 From FishC Mobile | 显示全部楼层
顶一顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-6 14:38:30 | 显示全部楼层

都不知道你的已知条件和预期结果   根本就看不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-6 20:54:57 | 显示全部楼层
wp231957 发表于 2023-3-6 14:38
都不知道你的已知条件和预期结果   根本就看不明白

这有啥不明白的,已知条件就是平面直角坐标系中的一条射线和一个矩形,预期结果就是射线和矩形边缘的交点,把计算过程封装成一个函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-9 12:36:29 | 显示全部楼层
我再顶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-10 22:00:07 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-3-10 22:05 编辑


我不知道,我只知道aa+bb=cc
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-13 18:40:40 | 显示全部楼层
帮顶
我是歌者文明清理员的小号
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-13 19:14:29 | 显示全部楼层
顶(使劲读题目ing)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-15 15:30:24 | 显示全部楼层
不太理解,看完你的问题,我变相的理解为求满足垂直平行条件矩阵的四顶点中,离原点最近的点。
这大概不是你的本意,但我理解下来得到的就是这样。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-15 19:28:00 | 显示全部楼层
曼查克 发表于 2023-3-15 15:30
不太理解,看完你的问题,我变相的理解为求满足垂直平行条件矩阵的四顶点中,离原点最近的点。
这大概不是 ...

确实不是我的本意。你可以这样理解:
一个子弹从原点射出,击中一堵平行垂直的墙,求子弹击中的那个点的坐标。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-19 07:28:32 | 显示全部楼层
本帖最后由 歌者文明清理员 于 2023-3-19 07:29 编辑

给个测试条件呗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-19 09:39:11 | 显示全部楼层

比如说
x, y = 6, 10
width, height = 10, 10
angle = 45
target = (6, 6) # 正确的结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-3-19 09:44:19 | 显示全部楼层

为什么我得到的结果是(-2,-6)
应该不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-3-23 18:41:52 | 显示全部楼层
傻眼貓咪 发表于 2023-3-23 15:28
不是很明白你的题目,像下面的图那样吗?

是的,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-30 02:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表