Запутался, не понимаю, как реализовать камеру. с минимальными и максимальными размерами клеток по 2 стратегиям Unifrorm UniformToFill( макс размер вся секта, или до
макс стороны), с плавным и клеточным перемещением(канвас всегда с целой клетки рисуется),
interface ICellCamera{
void Scale(float scaleFactor){ }
void Scale(float scaleFactor,float pointX,float pointY){ }
void Translate(float dx,float dy){}
//установить размер области просмотра канваса SizeChanged
void SetViewport(float w,float h);
}
камера должна возвращать область видимости для отрисовки.
Может есть другие решения, не могу найти не один пример.
Пример использования.
Camera camera=new Camera(100,100);
Color[,]colors=new Color[100,100];
//....
camera.SetViewport(w,h);
Translate(camera.TranslateX,camera.TranslateY);
// то же что и Offset, но на (ViewRows-(int)ViewRows)*cellHeight меньше.(gплавное перемещение)
// float ViewRows => CanvasHeight/CellHeight;
float dx=camera.CellSize;
float dy=camera.CellSize;
float begX=camera.OffsetX;
float begY=camera.OffsetY;
float endX=camera.GetLastViewX();
float endY=camera.GetLastViewY();
for(float y=begY;y<endY;y+=dy)
for(float x=begX;x<endX;x+=dx)
{
var indexY=camera.GetIndexByPosY(y):
var indexX=camera.GetIndexByPosX(x)
// все что камера должна делать Это вернуть эту клетку.
var c=colors[indexX,indexY];
drawRect(x,y,dx,dy,c);
}
Вроде простая задача, но не получается, тонны ошибок. От сложений float типа dx+dx+dx!=3*dx и куча всего. 3 раза пытаюсь по 300 строк кода уходит, и начинаю путатся, (типа забываю и путаю назначение свойств, порядок операций, прочие нежданчики).