查看: 3233|回复: 12

[已经解决] 两点之间的距离问题

[复制链接]
梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2022-2-27 23:50:28 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 灯笼菜刀王 于 2022-2-27 23:57 编辑

我知道两点之间的距离公式  √((x1-x2)^2 + (y1-y2)^2

但是以该值作为宽度 m = Math.sqrt((x1 - x2).abs^2 + (y1 - y2).abs^2)   描绘线条却短很多很多....
1.jpg

而用 m = (x1-x2).abs + (y1-y2).abs 来作为宽度, 却会长很多
2.jpg

请问, 正确公式该怎么做呢?

[pre lang="ruby"]x,y = 111,333
back = RPG::Sprite.new
  back.bitmap = Bitmap.new(640,480)
back.bitmap.fill_rect(0,0,640,480,Color.new(0,0,0))
  a = RPG::Sprite.new
  b = RPG::Sprite.new
  c = RPG::Sprite.new
  bbb = Bitmap.new(10,10)
  bbb.fill_rect(0,0,10,10,Color.new(0,255,255))
  a.bitmap = b.bitmap = bbb
  a.set_xy(320,240)
  b.set_xy(x,y)
  c.set_xy(320,240)
  #m = Math.sqrt((x - 320).abs^2 + (y - 240).abs^2)
  m = (x-320).abs + (y-240).abs
  c.bitmap = Bitmap.new(m,1)
  c.bitmap.fill_rect(0,0,m,1,Color.new(255,255,255))
  d = Math.atan((240-y).abs.to_f/(320-x).abs) / Math::PI * 180
  if x < 320 and y > 240 #第三象限
    r = -180
  elsif x < 320 and y < 240 #第一象限
    r = 90
  elsif x > 320 and y < 240 #第四象限
    r = -90
  else
    r = 0
  end
  c.angle = d + r[/pre]

PS: 单纯两点之间画线从雷达图脚本里学到了,它用的是在直线距离上每一个点描绘, 然而我现在想要的是,两点之间连接一张图片, 图片的宽度 = 两点之间的距离, 所以那种方法没办法用~~~
梦石
0
星屑
2866
在线时间
446 小时
注册时间
2016-9-26
回帖
1175
发表于 2022-2-28 00:35:17 | 显示全部楼层
相似三角形?
回复

使用道具 举报

梦石
0
星屑
2174
在线时间
1090 小时
注册时间
2006-1-10
回帖
780
发表于 2022-2-28 01:10:06 | 显示全部楼层
[pre lang="ruby"]  x,y = 111,333
  back = RPG::Sprite.new
  back.bitmap = Bitmap.new(640,480)
  back.bitmap.fill_rect(0,0,640,480,Color.new(0,0,0))
  a = RPG::Sprite.new
  b = RPG::Sprite.new
  c = RPG::Sprite.new
  aaa = Bitmap.new(10,10)
  aaa.fill_rect(0,0,10,10,Color.new(255,0,255))
  bbb = Bitmap.new(10,10)
  bbb.fill_rect(0,0,10,10,Color.new(0,255,255))
  a.bitmap = aaa
  b.bitmap = bbb
  a.x = 320
  a.y = 240
  b.x = x
  b.y = y
  c.x = 320
  c.y = 240
  m = Math.sqrt((x - 320)**2 + (y - 240)**2)
  c.bitmap = Bitmap.new(m,1)
  c.bitmap.fill_rect(0,0,m,1,Color.new(255,255,255))
  d = Math.atan2( (240 - y), (x - 320)) / Math::PI * 180
  c.angle = d [/pre]
捕获.PNG

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
灯笼菜刀王 + 1 原来如此

查看全部评分

回复

使用道具 举报

遠航の猫咪

梦石
3
星屑
26947
在线时间
2423 小时
注册时间
2005-10-15
回帖
987

开拓者

发表于 2022-2-28 01:29:42 | 显示全部楼层
因为ruby的^不是c#的^
请直接用Math.hypot(deltax, deltay) 不要自己编奇怪的表达式……

评分

参与人数 2星屑 +50 赞 +1 收起 理由
RyanBern + 50 认可答案
灯笼菜刀王 + 1 懂了, 原来有可以直接用的函数.

查看全部评分

SailCat (小猫子·要开心一点) 共上站 24 次,发表过 11 篇文章 上 次 在: [2006年01月28日11:41:18 星期六] 从 [162.105.120.91] 到本站一游。
回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2022-2-28 01:31:44 | 显示全部楼层
^ 在 ruby 中不是乘方,** 才是。
^ 是按位亦或。

可能是 matlab 敲习惯了(x)

点评

还有Julia  发表于 2022-2-28 08:59
^真的能表示乘方的,好像也就古代的vb c# pascal等几个不按套路出牌的语言和现代的matlab吧  发表于 2022-2-28 07:31

评分

参与人数 1赞 +1 收起 理由
灯笼菜刀王 + 1 确实是, 一直没想到是符号问题....

查看全部评分

回复

使用道具 举报

梦石
1
星屑
24088
在线时间
3339 小时
注册时间
2011-7-8
回帖
3862

开拓者

发表于 2022-2-28 01:54:52 | 显示全部楼层
罚酒三杯

评分

参与人数 1赞 +1 收起 理由
灯笼菜刀王 + 1 该罚,浪费了好几个小时...

查看全部评分

回复

使用道具 举报

梦石
0
星屑
3021
在线时间
337 小时
注册时间
2020-6-14
回帖
77

极短22参与

发表于 2022-2-28 11:39:46 | 显示全部楼层
power是相对复杂一点的函数,不同语言往往会用不同的运算符实现。这种确实直接调现成的好一点
回复

使用道具 举报

梦石
0
星屑
6483
在线时间
119 小时
注册时间
2020-1-8
回帖
205
发表于 2022-2-28 15:22:01 | 显示全部楼层
本帖最后由 RPGzh500223 于 2022-2-28 15:38 编辑

其实 Math.atan2可以直接算出角度,不用像Math.atan那样分象限讨论 ……楼上已经写出来了
我好奇你PS的内容,可否做张示意图

点评

图片拉伸就是了  发表于 2022-3-1 17:43
你提到的2个,我上网查了下…… 闪电效果一查好难,看不懂的数学和英文……  发表于 2022-3-1 17:18
要做像磁暴步兵, 萨满闪电链那样的效果=.=  发表于 2022-2-28 16:09
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部