public override State onMove(Vec pos) { mPos = pos; mOnMove(pos); mStateVar.logState("drag ", pos); return this; }
public Line(Vec pos0, Vec pos1, Color color) { mSeg = 3; mPos0 = pos0; mPos1 = pos1; mColor = color; }
public override State onDown(Vec pos, MouseButtons mb) { if (mb == mButton) return new ButtonStateDown(mStateVar, mb, pos); return this; }
public override State onMove(Vec pos) { if (mStateVar.mOnStartDrag != null) { ButtonStateVar.DragRezult rezult = mStateVar.mOnStartDrag(mPos); switch (rezult.mRezult) { case ButtonStateVar.DragRezult.Rezult.Nodrag: return new ButtonStateNone(mStateVar, mButton); case ButtonStateVar.DragRezult.Rezult.Drag: return new ButtonStateDrag( mStateVar, mButton, rezult.mOnDrag, rezult.mOnEndDrag, rezult.mOnPaint); } } else { return new ButtonStateNone(mStateVar, mButton); } mStateVar.logState("down ", pos); return this; }
public double getInvariant(Vec p0, Vec p1) { Vec delta = p0.minus(p1); if (mEuklide) return delta.mX * delta.mX + delta.mY * delta.mY; else return -delta.mX * delta.mX + delta.mY * delta.mY; }
public void drawLine(Pen pen, Vec pos0, Vec pos1) { mGraphics.DrawLine(pen, (float)(mWidth + pos0.mX), (float)(mHeight + pos0.mY), (float)(mWidth + pos1.mX), (float)(mHeight + pos1.mY)); }
public State onMove(Vec pos) { mPos = pos.minus(mShift); mLeft.onMove(mPos); mRight.onMove(mPos); return this; }
public override bool select(Vec pos) { Vec delta = pos.minus(mPos0); Vec len = mPos1.minus(mPos0); double proj1 = delta.dot(len) / len.lenghtSquare(); double proj2 = delta.perp().dot(len) / len.lenghtSquare(); return proj1 > 0 && proj1 < 1 && proj2 > -0.05 && proj2 < 0.05; }
public State onUp(Vec pos, MouseButtons button) { mPos = pos.minus(mShift); mLeft.onUp(mPos, button); mRight.onUp(mPos, button); return this; }
public void drawText(String text, Vec pos) { mGraphics.DrawString(text, new Font("Arial", 16), new SolidBrush(Color.Black), new PointF( (float)(mWidth + pos.mX), (float)(mHeight + pos.mY))); }
public override State onUp(Vec pos, MouseButtons mb) { if (mb == mButton) { if(mStateVar.mOnClick != null) mStateVar.mOnClick(pos); return new ButtonStateNone(mStateVar, mb); } return this; }
public TimeSpace() { mEuklide = false; mObjectList = new List<Object>(); mCenter = new Vec(0, 0); mSpeed = 0; mZoom = 1; mC = 1; updateMat(); updateScale(); }
public Mat(double speed, bool euklide) { if (euklide) { double sin = Math.Sin(speed); double cos = Math.Cos(speed); mAxisX = new Vec(cos, sin); mAxisY = new Vec(-sin, cos); } else { double sh = Math.Sinh(speed); double ch = Math.Cosh(speed); mAxisX = new Vec(ch, -sh); mAxisY = new Vec(-sh, ch); } }
public Vec scale(Vec vec) { return new Vec(vec.mX * mX, vec.mY * mY); }
public Vec scaleBack(Vec vec) { return new Vec(vec.mX / mX, vec.mY / mY); }
public Vec minus(Vec vec) { return new Vec(mX - vec.mX, mY - vec.mY); }
public Vec plus(Vec vec) { return new Vec(mX + vec.mX, mY + vec.mY); }
public abstract bool select(Vec pos);
public double dot(Vec vec) { return mX * vec.mX + mY * vec.mY; }
public Vec getWorldFromScreen(Vec screen) { // world = (mat-1) * (scale-1 * screen) + center return mMat.multBack(mScale.scaleBack(screen)).plus(mCenter); }
public Object selectObject(Vec screen) { Vec world = getWorldFromScreen(screen); foreach (Object obj in mObjectList) if (obj.select(world)) return obj; return null; }
public Mouse() { mShift = new Vec(0, 0); mPos = new Vec(0, 0); }
public ButtonStateDown(ButtonStateVar stateVar, MouseButtons button, Vec pos) : base(stateVar) { mPos = pos; mButton = button; }
public void setCenter(Vec vec) { mCenter = vec; }
void updateScale() { mScale = new Vec(mZoom * mC, mZoom); }
public Vec mult(Vec pos) { return mAxisX.mult(pos.mX).plus(mAxisY.mult(pos.mY)); }
ButtonStateVar.DragRezult onStartDragL(Vec posScreen) { switch (mInsert) { case Insert.Line: { Vec world = mTimeSpace.getWorldFromScreen(posScreen); Line line = new Line(world, world.plus(new Vec(20, 20)), Color.Black); insert(line); mInsert = Insert.None; return(new ButtonStateVar.DragRezult( delegate(Vec posScreenNew) { Vec world2 = mTimeSpace.getWorldFromScreen(posScreenNew); line.mPos1 = world2; Invalidate(); }, null, null)); } case Insert.LineLight: { Vec world = mTimeSpace.getWorldFromScreen(posScreen); Line line = new Line(world, world.plus(new Vec(20, 20)), Color.Orange); mTimeSpace.add(line); mInsert = Insert.None; Invalidate(); return(new ButtonStateVar.DragRezult( delegate(Vec posScreenNew) { Vec delta = posScreenNew.minus(posScreen); delta.lightCorect(); Vec world2 = mTimeSpace.getWorldFromScreen(posScreen.plus(delta)); line.mPos1 = world2; Invalidate(); }, null, null)); } case Insert.Invariant: { mInsert = Insert.None; Invalidate(); return(new ButtonStateVar.DragRezult( delegate(Vec posScreenNew) { Invalidate(); }, delegate(Vec posScreenNew) { Invalidate(); }, delegate(Vec posScreenNew, DrawInfo di) { Pen pen = new Pen(Color.LimeGreen); pen.Width = 1; di.drawLine(pen, posScreen, posScreenNew); Vec world = mTimeSpace.getWorldFromScreen(posScreen); Vec worldNew = mTimeSpace.getWorldFromScreen(posScreenNew); double invariant = mTimeSpace.getInvariant(world, worldNew) / (GRID * GRID); di.drawText(invariant.ToString(), posScreenNew.plus(new Vec(10, -10))); })); } default: return(new ButtonStateVar.DragRezult(true)); } }
public void logState(String state, Vec pos) { if (mLabel != null) mLabel.Text = state + " " + pos.mX + "x" + pos.mY; }
public Vec getCenterFromScreenAndWorld(Vec screen, Vec world) { // center = world - (mat-1) * (scale-1 * screen) return world.minus(mMat.multBack(mScale.scaleBack(screen))); }
Mat(Vec ax, Vec ay) { mAxisX = ax; mAxisY = ay; }
public Vec getScreenFromWorld(Vec world) { // screen = scale * (mat * (world - center)) return mScale.scale(mMat.mult(world.minus(mCenter))); }
public Vec multBack(Vec pos) { return new Mat( new Vec(+mAxisX.mX, -mAxisX.mY), new Vec(-mAxisY.mX, +mAxisY.mY)).mult(pos); }
override public State onMove(Vec pos) { mStateVar.logState("none ", pos); return(this); }