mono c # CairoHelper.Translate - PullRequest
       27

mono c # CairoHelper.Translate

1 голос
/ 25 февраля 2012

с использованием Cairo;

Я нарисовал прямоугольник внутри большего прямоугольника, который находится внутри области рисования.

Мне удалось прикрепить событие к области рисования, которое является объектом Iрасширились от него

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 с "внешней" точки зрения это х = 90, у = 45;ширина = 180, высота = 100 Я использовал translate (так как половина этого скопирована) размера / 2, так что это означает, что область рисования делала изменение размера квадрата, чтобы решить эту проблему, я сохранял умножение позицииэто на 2, но это не работает, если я получаю "хиты" за пределами нарисованного прямоугольника.

Каков наилучший способ сделать это?Я имею в виду перевод позиций XY из окна в область рисования, я видел, что это возможно на других языках, но не уверен, как это сделать в C # и в области рисования из моно.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 26 февраля 2012

Я делал это несколько раз в C w SDL и C # с Cairo, по сути, вы хотите иметь возможность преобразовывать ограничивающий прямоугольник каждого из ваших прямоугольников в координаты, которые вы используете для рендеринга в Каире, и из них.canvas.

Для каждого из ваших прямоугольников вы будете располагать свои прямоугольники в своем собственном мире.Мне нравится называть их "мировыми координатами" и их "экранными координатами" (которые соответствуют карте, где будет находиться ваша мышь).

Вы можете сохранить мировые координаты каждого блока, а затем перевести их на экранные длякаждый кадр, который вы визуализируете.

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 (), чтобы получитькоординаты экрана.Затем вы можете использовать ту же самую вещь, чтобы работать, если ваша мышь находится в окне экрана поля мира.

...