104 lines
2.6 KiB
C#
104 lines
2.6 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Godot;
|
|
|
|
namespace Rokojori
|
|
{
|
|
|
|
public class RationalCubicBezier
|
|
{
|
|
public static float Compute(
|
|
float t,
|
|
float p0, float p1, float p2, float p3,
|
|
float w0, float w1, float w2, float w3
|
|
)
|
|
{
|
|
var bp0 = ( 1 - t ) * ( 1 - t ) * ( 1 - t ) * w0;
|
|
var bp1 = 3 * ( 1 - t ) * ( 1 - t ) * t * w1;
|
|
var bp2 = 3 * ( 1 - t ) * t * t * w2;
|
|
var bp3 = t * t * t * w3;
|
|
|
|
var weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
|
|
|
|
var projection = bp0 + bp1 + bp2 + bp3;
|
|
|
|
return weighted / projection;
|
|
}
|
|
|
|
public static Vector2 Compute(
|
|
float t,
|
|
Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3,
|
|
float w0, float w1, float w2, float w3
|
|
)
|
|
{
|
|
var bp0 = ( 1 - t ) * ( 1 - t ) * ( 1 - t ) * w0;
|
|
var bp1 = 3 * ( 1 - t ) * ( 1 - t ) * t * w1;
|
|
var bp2 = 3 * ( 1 - t ) * t * t * w2;
|
|
var bp3 = t * t * t * w3;
|
|
|
|
var weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
|
|
|
|
var projection = bp0 + bp1 + bp2 + bp3;
|
|
|
|
return weighted / projection;
|
|
}
|
|
|
|
public static Vector3 Compute(
|
|
float t,
|
|
Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3,
|
|
float w0, float w1, float w2, float w3
|
|
)
|
|
{
|
|
var bp0 = ( 1 - t ) * ( 1 - t ) * ( 1 - t ) * w0;
|
|
var bp1 = 3 * ( 1 - t ) * ( 1 - t ) * t * w1;
|
|
var bp2 = 3 * ( 1 - t ) * t * t * w2;
|
|
var bp3 = t * t * t * w3;
|
|
|
|
var weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
|
|
|
|
var projection = bp0 + bp1 + bp2 + bp3;
|
|
|
|
return weighted / projection;
|
|
}
|
|
|
|
|
|
public static Vector2 Compute( float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3 )
|
|
{
|
|
var bp0 = ( 1 - t ) * ( 1 - t ) * ( 1 - t ) * p0.Z;
|
|
var bp1 = 3 * ( 1 - t ) * ( 1 - t ) * t * p1.Z;
|
|
var bp2 = 3 * ( 1 - t ) * t * t * p2.Z;
|
|
var bp3 = t * t * t * p3.Z;
|
|
|
|
var weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
|
|
|
|
var projection = bp0 + bp1 + bp2 + bp3;
|
|
|
|
var result = weighted / projection;
|
|
|
|
return new Vector2( result.X, result.Y );
|
|
}
|
|
|
|
public static Vector3 Compute( float t, Vector4 p0, Vector4 p1, Vector4 p2, Vector4 p3 )
|
|
{
|
|
var bp0 = ( 1 - t ) * ( 1 - t ) * ( 1 - t ) * p0.W;
|
|
var bp1 = 3 * ( 1 - t ) * ( 1 - t ) * t * p1.W;
|
|
var bp2 = 3 * ( 1 - t ) * t * t * p2.W;
|
|
var bp3 = t * t * t * p3.W;
|
|
|
|
var weighted = p0 * bp0 + p1 * bp1 + p2 * bp2 + p3 * bp3;
|
|
|
|
var projection = bp0 + bp1 + bp2 + bp3;
|
|
|
|
var result = weighted / projection;
|
|
|
|
return new Vector3( result.X, result.Y, result.Z );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
} |