Hunselfunsel
Hunselfunsel

Reputation: 349

Unity Circle calculation

for my programm im programming a "clock like" behaviour. Meaning i

But i get a weird bug. The first time i click and hold the mouse my images "jump" to different positions. if i hold the mouse down i can rotate my clock ust fine. When i MouseUp and start dragin from the same image it works well. if i go to another image i get this "Jump" again.

When i only have a few images on my clock i see that it doesnt jump. but the start position seems to bee off. When i only have one item, i can rotate it in a circle, but the moment i start to rotate it jumps away from my mouse and than i can rotate it as desired.

For me it seems to be a wrong "starting point" when first dragging an item. SInce it works fine when i than drag the same item again and again. Unfortunately i cant find the damn bug, and im searching the whole day already.

#
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();

}

Edit:

Ok i Edited the code but it still is not working. I added the following method:

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

}

and i changed the drag method acordingly

public void OnDrag (PointerEventData eventData)
{

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

    SetDirty();

}

The "Jumping" at the beginning of my drag event is gone, but the speed of the draggin is not on par with my mouse. The closer i am to my starting point of the drag, the faster it moves, the further away i am the slower it gets. I dont know if this brought me closer to a solution or further away :(

Edit2: Ok i think the problem might be that my calculations were all done from the center point of view as 0,0 point. Unity has the bottom left point as 0,0. So i somehow have to translate all those coordiantes first...

Upvotes: 2

Views: 1087

Answers (3)

Hunselfunsel
Hunselfunsel

Reputation: 349

All that was needed was a transformation to kartesian coordinates

//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);

and an addition of the delta instead of the subtraction

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

Upvotes: 1

Paul Gilmore
Paul Gilmore

Reputation: 478

I don't think you are displaying all the relevant code, but your OnDrag function, specifically diffX, and diffY probably provide the answer for you.

I believe you're taking the absolute coordinates of the location you pick, and using them to generate your angle - which means that almost anywhere you click is a big jump from however the current angle is set. Your initial click handler should save off a starting coordinate, and your OnDrag should compare itself against that initial coordinate, based on how far you've dragged from that saved location.

Upvotes: 0

Gottfried Lesigang
Gottfried Lesigang

Reputation: 67311

Your mouse coordinates are relative to the control you click in. You could re-calculate them using the control's position within its container or you use absolute coordinates.

Upvotes: 0

Related Questions