#include "selection.h" Selection::Selection(void) { first.X=-1; first.Z=-1; last.X=-1; last.Z=-1; } Selection::Selection(int x, int z) { first.X=x; first.Z=z; last.X=x; last.Z=z; } Selection::~Selection(void) { } void Selection::set(int returnfirstPick ,int returnSecondPick) { int coordX1=returnfirstPick%100; int coordZ1=returnfirstPick/100; int coordX2=returnSecondPick%100; int coordZ2=returnSecondPick/100; if (coordX1<coordX2){first.X=coordX1; last.X= coordX2;} else {first.X=coordX2; last.X= coordX1;} if (coordZ1<coordZ2){first.Z=coordZ1; last.Z= coordZ2;} else { first.Z=coordZ2; last.Z= coordZ1;} applied=false; } void Selection::flat(MadMap *map, double h) { for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++){ map->setY(j+0.1,i+0.1,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.9,h);} } void Selection::up(MadMap *map, double k){ for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++) map->upTile(j,i,k); } void Selection::zero(MadMap *map,double k) { for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++) map->zeroTile(j,i,k); } void Selection::level(MadMap *map, double k) { double h; for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++){ h=map->getY(j+0.5,i+0.5)+k; map->setY(j+0.1,i+0.1,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.9,h); } } void Selection::slide(MadMap *map, double k) { double h; int i,j; if ((last.Z==first.Z)& (first.X==last.X)){ h=map->getY(first.X+0.5,last.Z+0.5); h=h+k; map->setY(first.X+0.5,last.Z+0.5,h); } else if ((last.Z==first.Z)){i =last.Z; for (int j=first.X+1;j<=last.X;j++) { h=map->getY(j,i); h=h+k; map->setY(j-0.1,i+0.1,h); map->setY(j-0.1,i+0.9,h); map->setY(j+0.1,i+0.1,h); map->setY(j+0.1,i+0.9,h); } } else if ((last.X==first.X)){int j =last.X; for (int i=first.Z+1;i<=last.Z;i++) { h=map->getY(j,i); h=h+k; map->setY(j+0.9,i-0.1,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.1,i-0.1,h); map->setY(j+0.1,i+0.1,h); } } else for (i=first.Z+1 ;i<=last.Z;i++) for ( j=first.X+1;j<=last.X;j++) { h=map->getY(j,i); h=h+k; map->setY(j+0.1,i+0.1,h); map->setY(j-0.1,i-0.1,h); map->setY(j+0.1,i-0.1,h); map->setY(j-0.1,i+0.1,h); } } void Selection::incline(MadMap *map,double k) { double h,i,j,o; if (map->getY(first.X,first.Z)==map->getY(last.X,last.Z)){ for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++) { h=map->getY(j,i); o=h; if ((last.X-first.X)>(last.Z-first.Z)) h=h+k*(j-first.X); else h=h+k*(i-first.Z); if (h>o) { map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.9,i+0.9,h); map->setY(j+0.1,i+0.1,h);} } for (int i=last.Z ;i>=first.Z;i--) for (int j=last.X;j>=first.X;j--) { h=map->getY(j,i); o=h; if ((last.X-first.X)>(last.Z-first.Z)) h=h-k*(-j+last.X); else h=h-k*(-i+last.Z); if (h>o) { map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.9,i+0.9,h); map->setY(j+0.1,i+0.1,h); } } } else if (map->getY(first.X,first.Z)<map->getY(last.X,last.Z)) for (int i=first.Z ;i<=last.Z;i++) for (int j=first.X;j<=last.X;j++) { h=map->getY(j,i); if ((last.X-first.X)>(last.Z-first.Z)) h=h+k*(j-first.X); else h=h+k*(i-first.Z); map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.9,i+0.9,h); map->setY(j+0.1,i+0.1,h); } else for (int i=last.Z ;i>=first.Z;i--) for (int j=last.X;j>=first.X;j--) { h=map->getY(j,i); if ((last.X-first.X)>(last.Z-first.Z)) h=h-k*(-j+last.X); else h=h-k*(-i+last.Z); map->setY(j+0.1,i+0.9,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.9,i+0.9,h); map->setY(j+0.1,i+0.1,h); } i =last.Z; for ( j=first.X+1;j<=last.X;j++) { h=map->getY(j,i); map->setY(j-0.1,i+0.1,h); map->setY(j-0.1,i+0.9,h); map->setY(j+0.1,i+0.1,h); map->setY(j+0.1,i+0.9,h); } i =first.Z; for ( j=first.X+1;j<=last.X;j++) { h=map->getY(j,i); map->setY(j-0.1,i+0.1,h); map->setY(j-0.1,i+0.9,h); map->setY(j+0.1,i+0.1,h); map->setY(j+0.1,i+0.9,h); } // } j =last.X; for ( i=first.Z+1;i<=last.Z;i++) { h=map->getY(j,i); map->setY(j+0.9,i-0.1,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.1,i-0.1,h); map->setY(j+0.1,i+0.1,h); } j =first.X; for ( i=first.Z+1;i<=last.Z;i++) { h=map->getY(j,i); map->setY(j+0.9,i-0.1,h); map->setY(j+0.9,i+0.1,h); map->setY(j+0.1,i-0.1,h); map->setY(j+0.1,i+0.1,h); } } void Selection::function(MadMap *map, MadMap *undomap, int type, double val) { //double h; if (!applied) { applied=true; map->copy(undomap);} switch (type) { case LEVEL: level(map, val/10); incline(map, 0); slide(map, +0.0); break; case SLIDE: slide(map, val/10); break; case INCLINE: if (first.X-last.X!=first.Z-last.Z) { incline(map, val/100); slide(map, +0.0);} break; case FLAT: flat(map,map->getY((last.X+first.X)/2,(last.Z+first.Z)/2)+val); break; case UP: up(map,val); break; case ZERO: zero(map,val); break; case PYRAMID: if (first.X-last.X==first.Z-last.Z) { pyramid(map, val/(10*(last.X-first.X)+1)); slide(map, +0.0);} default: break; } } void Selection::pyramid(MadMap *map,double k) { Selection s1; slide(map,k); if (first.X<=last.X){ s1.first.X=first.X+1; s1.last.X=last.X-1; s1.first.Z=first.Z+1; s1.last.Z=last.Z-1; s1.pyramid(map,k);} }