Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算Bezier曲线的中点_C#_Wpf_Point_Bezier - Fatal编程技术网

C# 计算Bezier曲线的中点

C# 计算Bezier曲线的中点,c#,wpf,point,bezier,C#,Wpf,Point,Bezier,我有一个通过三个点绘制贝塞尔曲线的函数。我已经有两个点(起点和终点)-A和B。我如何计算这两个点之间的中点,因为中点总是比这两个点的线性函数稍高或稍低 示例: 任何公式、想法都会很棒 我想这就是你想要的: 它详细介绍了如何计算贝塞尔曲线上的各个点 对于您的应用程序,您可能还对以下更具体的示例感兴趣: 如果你真的想进入这一领域,那么我建议你使用以下初级读物: 贝塞尔曲线比简单的圆弧要复杂一些。对于圆弧,可以使用以下公式: R = H/2 + W^2/8H …这对贝塞尔曲线绝对不起作用。例

我有一个通过三个点绘制贝塞尔曲线的函数。我已经有两个点(起点和终点)-A和B。我如何计算这两个点之间的中点,因为中点总是比这两个点的线性函数稍高或稍低

示例


任何公式、想法都会很棒

我想这就是你想要的:

它详细介绍了如何计算贝塞尔曲线上的各个点

对于您的应用程序,您可能还对以下更具体的示例感兴趣:

如果你真的想进入这一领域,那么我建议你使用以下初级读物:

贝塞尔曲线比简单的圆弧要复杂一些。对于圆弧,可以使用以下公式:

R = H/2 + W^2/8H
…这对贝塞尔曲线绝对不起作用。例如,在二次贝塞尔曲线上,要计算点,必须使用:


资料来源:,

下面是我用来获取四次贝塞尔曲线控制点的内容。当控制点位于曲线上时,它应该适用于您的问题。它是用Swift编写的,但是你应该能够很容易地将它转换成另一种语言。基本上,在直线的中点(其点为点1和点2),我算出一条具有给定长度的垂直线。顺时针参数确定点应落在直线的哪一侧

func getControlPointWithPoint1(point1:CGPoint, point2:CGPoint, length:CGFloat, clockwise:Bool) -> CGPoint {
  let angle = getAngleWithPoint1(point1, point2:point2)
  let direction = clockwise ? 1 : -1
  let perpendicularAngle = angle + (CGFloat(direction) * CGFloat((M_PI / 2)))
  let midPoint = getMidPointWithPoint1(point1, point2:point2)
  return CGPointMake(midPoint.x + (cos(perpendicularAngle) * length), midPoint.y + (sin(perpendicularAngle) * length))
}

func getAngleWithPoint1(point1:CGPoint, point2:CGPoint) -> CGFloat {
  return atan2((point2.y - point1.y), (point2.x - point1.x))
}

func getMidPointWithPoint1(point1:CGPoint, point2:CGPoint) -> CGPoint {
  return CGPointMake((point1.x + point2.x) / 2, (point1.y + point2.y) / 2)
}
下面是它如何映射到您的图表字母:

c = getControlPointWithPoint1(a, point2:b, length:h, clockwise:true)

按照Mark的回答,下面是C语言中的代码片段#


如果我能帮助你,我会很高兴的

这是我的解决办法

    Vector2 posA = sphereA.transform.position;
    Vector2 posB = sphereB.transform.position;

    Gizmos.color = Color.blue;
    Gizmos.DrawLine(posA, posB);

    float distance = Vector2.Distance(posA, posB);
    Vector2 direction = (posB - posA).normalized;

    Vector2 v2 = end - start;
    var angle = Mathf.Atan2(v2.y, v2.x) * Mathf.Rad2Deg;      

    var midStartPos = posA + direction * (distance / 2f);

    Gizmos.color = Color.red;
    Gizmos.DrawSphere(midStartPos, 0.02f);

    var height = 0.3f;

    height = Mathf.Clamp(height, 0f, Vector2.Distance(posA, posB) * 0.5f);

    angle = 90f + angle;

    var goalDirection = new Vector2(Mathf.Cos(angle * Mathf.Deg2Rad), Mathf.Sin(angle * Mathf.Deg2Rad));

    if (goalDirection.y < 0f)
    {
        goalDirection.x = -goalDirection.x;
        goalDirection.y = Mathf.Abs(goalDirection.y);
    }

    var midEndPos = midStartPos + goalDirection * height;

    Gizmos.color = Color.blue;
    Gizmos.DrawLine(midStartPos, midEndPos);

    Gizmos.color = Color.red;
    Gizmos.DrawSphere(midEndPos, 0.02f);
vector2posa=sphereA.transform.position;
Vector2 posB=sphereB.transform.position;
Gizmos.color=color.blue;
小发明。抽绳(posA、posB);
浮动距离=矢量2.距离(位置A、位置B);
向量2方向=(posB-posA)。归一化;
矢量2 v2=结束-开始;
变量角度=数学Atan2(v2.y,v2.x)*数学Rad2Deg;
var midStartPos=位置A+方向*(距离/2f);
Gizmos.color=color.red;
Gizmos.DrawSphere(中间开始位置,0.02f);
var高度=0.3f;
高度=数学夹具(高度,0f,矢量2.距离(位置A,位置B)*0.5f);
角度=90f+角度;
var goalDirection=new Vector2(数学Cos(角度*Mathf.Deg2Rad),数学Sin(角度*Mathf.Deg2Rad));
if(目标方向y<0f)
{
goalDirection.x=-goalDirection.x;
goalDirection.y=Mathf.Abs(goalDirection.y);
}
var midEndPos=midStartPos+目标方向*高度;
Gizmos.color=color.blue;
小发明。抽绳(中间开始位置、中间结束位置);
Gizmos.color=color.red;
Gizmos.DrawSphere(中间位置,0.02f);

谢谢您抽出时间。非常有趣的信息,但在我看来,它不会帮助我计算点C。我的意思是,我想创建一个程序,在这里我可以连接两个点,不是直的,而是曲线(使用贝塞尔曲线),所以我需要第三个点C从A和B自动计算。我希望这为更高连接下的第二个连接腾出空间。所有的一切都发生在画布上,所以,使用Left,Top属性。Sry英语版顺便说一句:)@morad1n如果它不是一条简单的圆弧,而是一条贝塞尔曲线,那么你需要阅读我提供的信息。您需要计算控制柄点的位置。《入门》对此进行了详细介绍。你确定你要找的是贝塞尔曲线吗?如果有人使用带有2个控制点的三次贝塞尔曲线,我发现找到中点非常有用。
    Vector2 posA = sphereA.transform.position;
    Vector2 posB = sphereB.transform.position;

    Gizmos.color = Color.blue;
    Gizmos.DrawLine(posA, posB);

    float distance = Vector2.Distance(posA, posB);
    Vector2 direction = (posB - posA).normalized;

    Vector2 v2 = end - start;
    var angle = Mathf.Atan2(v2.y, v2.x) * Mathf.Rad2Deg;      

    var midStartPos = posA + direction * (distance / 2f);

    Gizmos.color = Color.red;
    Gizmos.DrawSphere(midStartPos, 0.02f);

    var height = 0.3f;

    height = Mathf.Clamp(height, 0f, Vector2.Distance(posA, posB) * 0.5f);

    angle = 90f + angle;

    var goalDirection = new Vector2(Mathf.Cos(angle * Mathf.Deg2Rad), Mathf.Sin(angle * Mathf.Deg2Rad));

    if (goalDirection.y < 0f)
    {
        goalDirection.x = -goalDirection.x;
        goalDirection.y = Mathf.Abs(goalDirection.y);
    }

    var midEndPos = midStartPos + goalDirection * height;

    Gizmos.color = Color.blue;
    Gizmos.DrawLine(midStartPos, midEndPos);

    Gizmos.color = Color.red;
    Gizmos.DrawSphere(midEndPos, 0.02f);