線上を通る点
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();
}
}