c# - 单位圆计算

标签 c# unity3d geometry

对于我的程序,我正在编写一个“类似时钟”的行为。意思是我

  • 将一些图片围成一圈(作品)
  • 如果我单击并拖动任何项目,所有项目都应随鼠标旋转(有效)

但是我遇到了一个奇怪的错误。我第一次单击并按住鼠标时,我的图像“跳”到不同的位置。如果我按住鼠标,我可以很好地旋转我的时钟。 当我使用 MouseUp 并从同一图像开始拖动时,效果很好。如果我转到另一张图片,我会再次出现此“跳转”。

当我的时钟上只有几张图片时,我发现它没有跳动。但起始位置似乎偏离了。 当我只有一个项目时,我可以将它旋转一圈,但是当我开始旋转时它会跳离我的鼠标,然后我可以根据需要旋转它。

对我来说,第一次拖动项目时,这似乎是一个错误的“起点”。因为当我一次又一次地拖动同一个项目时它工作正常。 不幸的是我找不到那个该死的错误,我已经搜索了一整天了。

#
public void SetLayoutHorizontal ()
{
    Debug.Log ("LAYOUT");

    for (var i =0; i < Rect.childCount; i++)
    {
        var PanelPrefab = Rect.GetChild (i) as RectTransform;

        Transform ImageObject = PanelPrefab.GetComponentInChildren<Transform>().Find("Image");

        if (PanelPrefab == null)
            continue;

        PanelPrefab.sizeDelta = CellSize;
        PanelPrefab.anchoredPosition = new Vector2(radius * Mathf.Sin( CalculateCircleAngle(i) - deltaRadian),radius * Mathf.Cos(CalculateCircleAngle(i) - deltaRadian));

    }

}

private float CalculateCircleAngle(int parts)
{
    //parts == Number of parts the whole circle is to be cut into
    return parts * (360/Rect.childCount) * (Mathf.PI/180);
}

public void OnDrag (PointerEventData eventData)
{
    var diffX = eventData.position.x - _rect.rect.width/2; // MouseX - CenterScreenX
    var diffY = eventData.position.y - _rect.rect.height/2; // MouseY - CenterScreenY
    deltaRadian = Mathf.Atan2(diffY,diffX);

    SetDirty();

}

编辑:

好的,我编辑了代码,但它仍然无法正常工作。 我添加了以下方法:

public void OnBeginDrag(PointerEventData eventData)
{
    originalX = eventData.position.x;
    originalY = eventData.position.y;

}

我相应地改变了拖动方法

public void OnDrag (PointerEventData eventData)
{

    var diffX = eventData.position.x - originalX;
    var diffY = eventData.position.y - originalY;
    deltaRadian = Mathf.Atan2(diffY,diffX);

    SetDirty();

}

我的拖动事件开始时的“跳跃”消失了,但拖动的速度与我的鼠标不相上下。 我离阻力的起点越近,它移动得越快,距离我越远,它就越慢。 我不知道这是否让我离解决方案更近了还是更远了:(

编辑2: 好吧,我认为问题可能是我的计算都是从中心角度作为 0,0 点完成的。 Unity 的左下角为 0,0。所以我必须先翻译所有这些坐标...

最佳答案

所需要的只是转换为卡氏坐标

//Convert to kartesian coordinates with 0,0 in center of screen
    var diffX = (eventData.position.x - _rect.rect.width / 2) % (_rect.rect.width / 2);
    var diffY = (eventData.position.y - _rect.rect.height / 2) % (_rect.rect.height / 2);

和增量的加法而不是减法

PanelPrefab.anchoredPosition = new Vector2(radius * Mathf.Sin(CalculateCircleAngle(i) + deltaRadian),radius * Mathf.Cos(CalculateCircleAngle(i) + deltaRadian));

关于c# - 单位圆计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32532892/

相关文章:

C#:将 '0' 转换为 int

c# - Process.Start() 不会在同一用户下生成新进程

C# 位图图像、字节数组和流!

android - Unity Android 后台运行

c# - 按 Id 排序数组元素并删除 Unity/C# 中的特定元素

Javascript 和分割,在 for 循环中崩溃浏览器

c# - 将 WebApi 和 C# 站点托管在同一域下

c# - 如何在纯 C# 中制作队列消息代理

javascript - 创建 JavaScript 倒计时

filesystems - 部门/领域在生产系统中的使用