mono c# CairoHelper.Превод

използване на Кайро;

Начертах правоъгълник вътре в по-голям правоъгълник, който е вътре в зона за рисуване.

Успях да прикача събитие към областта за рисуване, което е обект, който разширих от него

this.AddEvents ((int) EventMask.ButtonPressMask);

this.ButtonPressEvent += delegate(object o, ButtonPressEventArgs args) {
    hasInterface(args.Event.X, args.Event.Y);

    Console.WriteLine("Button Pressed " + args.Event.X + ", " + args.Event.Y);
};

Динамично рисувам квадратите, използвайки:

cr.Translate(width/2, height/2);

cr.Rectangle((pX + (i * tmp)) , pY, boxsize, boxsize);      

private void recordPosition(double x, double y)
{
    x = x*2;
    y = y*2;
    boxCoordinates.Add( new double[,]
        { 
            {x, y}
        }
    ); // store coords
}


List<double,double> boxCoordinates

Така че за вътрешността на зоната за рисуване квадратът е начертан при x=0, y=0 от "външна" гледна точка е в x=90, y=45; ширина = 180, височина = 100 Използвах превод (тъй като половината от това е копирано) на размера/2, така че това означава, че областта за рисуване е преоразмерявала квадрата, за да реша този проблем, запазвах умножението на позицията с 2, но това не работи, ако получавам "удари" извън начертания правоъгълник.

Кой е най-добрият начин да направите това? Искам да преведа X Y позициите от прозореца в областта за рисуване, видях, че това е възможно на други езици, но не съм сигурен как да го направя в C# и областта за рисуване от моно.

Благодаря за всяка помощ.


person Fernando André    schedule 25.02.2012    source източник


Отговори (1)


Правил съм това няколко пъти в C w SDL и C# с Cairo, като цяло искате да можете да конвертирате ограничителната кутия на всеки от вашите правоъгълници към и от координатите, които използвате за изобразяване на платното на cairo.

За всеки от вашите правоъгълници ще имате местоположението на вашите правоъгълници в собствения ви свят. Харесва ми да ги наричам „световни координати“ и техните „екранни координати“ (които съответстват на мястото, където ще бъде мишката ви).

Можете да съхранявате световните координати на всяка кутия и след това да ги превеждате в екранни за всеки кадър, който изобразявате.

public class Shape {
  public Point WorldLoc { get; set; }
}

Бихте направили цялата си физика (ако имате такава) върху стойностите на WorldLoc. Когато дойдете да рендирате, искате да можете да конвертирате вашите WorldLoc в ScreenLoc.

public class Scene {
  public double Zoom;
  public Point Offset;

  public Point WorldToScreen( Point world ){
    var p = new Point();
    p.x = (world.x - Offset.x) * Zoom;
    p.y = (world.y - Offset.y) * Zoom;
    return p;
  }
} 

Всеки път, когато изобразявате нещо в тази сцена, ще използвате WorldToScreen(), за да получите координатите на екрана. След това можете да използвате същото нещо, за да разберете дали мишката ви е в екранната кутия на световна кутия.

person IanNorton    schedule 25.02.2012
comment
Имате съмнения, логиката е много подобна на това, което правя, но откъде идва тази променлива Offset, имам предвид как я инициализирате? Също така използвам List‹double,double›, за да запазя позицията на формата, но има повече смисъл да го правя като вас, но за тестване мисля да продължа да използвам List. - person Fernando André; 27.02.2012
comment
Отместването ще бъде местоположението на горния ляв ъгъл на прозореца за изглед във вашия свят. Поддържането на много списъчни обекти изглежда разточително. - person IanNorton; 27.02.2012
comment
Това, което имах предвид, е по-скоро като List‹Shape› Shape има x и y и други подробности за този обект. Благодаря за вашата помощ. - person Fernando André; 28.02.2012