gpt4 book ai didi

javascript - 在矩形的边缘上获取两个点

转载 作者:搜寻专家 更新时间:2023-10-30 21:25:27 24 4
gpt4 key购买 nike

我有一个矩形,我想:

  1. 在其中一个(任意)边上随机取一个点。
  2. 在一侧(先前选择的除外)获取一个随机点。

我最初的方法是为每个可能的边创建数组。

var arr:Array = [[{x:0,y:0},           // Top
{x:width,y:0}], //
[{x:width,y:0}, // Right
{x:width,y:height}], //
[{x:width,y:height}, // Bottom
{x:0,y:height}], //
[{x:0,y:height}, // Left
{x:0,y:0}]]; //

然后,我得到了双方。randRand 的一个实例并且有以下方法:.next() 提供一个介于 01 之间的随机数.between(x,y) 返回一个介于 xy 之间的随机数。

var firstSide:Array = arr[rand.next() * arr.length];
var secondSide:Array;
do {
secondSide = arr[rand.next() * arr.length];
} while(secondSide.equals(firstSide));

最后,我计算了我的分数。

var pointOnFirstSide:Object = {x:rand.between(firstSide[0].x, firstSide[1].x),
y:rand.between(firstSide[0].y, firstSide[1].y};
var pointOnSecondSide:Object = {x:rand.between(secondSide[0].x, secondSide[1].x),
y:rand.between(secondSide[0].y, secondSide[1].y};

我认为这不是解决此问题的最有效方法。

你会怎么做?

最佳答案

假设我们有以下接口(interface)和类型:

interface Rand {
next(): number;
between(x: number, y: number): number;
}
interface Point {
x: number;
y: number;
}
type PointPair = readonly [Point, Point];

并相信您在评论中所说的程序是:首先随机选择两侧,然后在这些侧上随机选择点...首先让我们看看随机选择两侧涉及什么:

  const s1 = Math.floor(rand.between(0, arr.length));
const s2 = (Math.floor(rand.between(1, arr.length)) + s1) % arr.length;

s1s2代表 arr 的索引我们正在选择。第一个选择 0 之间的整数并且比数组的长度少一。我们通过在 0 之间选择一个实数(好吧, float ,随便什么)来做到这一点。和数组的长度,然后取 floor那个实数。由于长度是 4 ,我们正在做的是在 0 之间均匀地选择一个实数。和 4 .这些数字中有四分之一介于 0 之间。和 1 , 1 之间的另一个四分之一和 2 , 2 之间的另一个四分之一和 3 , 最后一个季度介于 3 之间和 4 .这意味着您有 25% 的机会选择每个 0 , 1 , 23 . (选择 4 的机会基本上为 0,或者如果 randexcludes the upper bound 的正常方式实现,则可能恰好为 0)。

对于 s2我们现在在 1 之间统一选择一个数字和数组的长度。在这种情况下,我们选择 1 , 2 , 或 3每个都有 33% 的机会。我们将该数字添加到 s1然后取 remainder除以 4 .把我们正在做的事情想象成从第一面开始 s1 ,然后顺时针移动 1、2 或 3 个边(比方说)以选择下一个边。这完全消除了两次选择同一边的可能性。


现在让我们看看在给定 PointPair 的情况下,在线段上随机选取一个点(可以定义为 p1 ,对应于线段的两端 p2Rand)涉及什么?实例:

function randomPointOnSide([p1, p2]: PointPair, rand: Rand): Point {
const frac = rand.next(); // between 0 and 1
return { x: (p2.x - p1.x) * frac + p1.x, y: (p2.y - p1.y) * frac + p1.y };
}

这里我们要做的是选择一个随机数 frac , 代表距离 p1 的距离至 p2我们想去。如果frac0 , 我们选择 p1 .如果frac1 , 我们选择 p2 .如果frac0.5 ,我们选择 p1 的中间位置和 p2 .这个的一般公式是 p1 之间的线性插值。和 p2给出frac .


希望在这两者之间,您可以实现您正在寻找的算法。祝你好运!

Link to code

关于javascript - 在矩形的边缘上获取两个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57260480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com