線上を通る点
dotto  2018/11/06(Tue) 14:05
スプライン曲線で生成した線に対して、
その線上を通る点をマウスで操作できるようにしたいのですが、
どのようにして、スプライン曲線の線上だと判定したら良いのでしょうか
記事編集
Reputeless  2018/11/08(Thu) 20:16
スプライン曲線の全長を計算して、進んだ距離を計算すると良いと思います。
以下は粗い方法ですが、細かい計算を追加すればもっと滑らかにできます。


# include <Siv3D.hpp>

void Main()
{
const LineString lines
{
Vec2(100, 100),
Vec2(300, 300),
Vec2(400, 200)
};

const LineString spline = lines.toCatmullRomSpline();

double length = 0.0;

for (size_t i = 0; i < spline.num_lines; ++i)
{
length += spline.line(i).length();
}

double t = 0.0;

while (System::Update())
{
t = Math::Fraction(t + 0.001);

ClearPrint();

const double target = length * t;

Println(t);

Println(target, L"/", length);

Vec2 pos(0, 0);

double x = 0.0;

for (size_t i = 0; i < spline.num_lines; ++i)
{
x += spline.line(i).length();

if (x >= target)
{
pos = spline.point(i);
break;
}
}

spline.draw();

Circle(pos, 10).draw();
}
}
編集
dotto  2018/11/13(Tue) 13:13
ありがとうございます。
編集
件名
Re: 線上を通る点
名前
コメント
画像添付


投稿修正キー (投稿を修正する時に使います)
画像認証 (右画像の数字を入力) 投稿キー

- WEB PATIO -