/** @file LinePoint.java
*
* @author marco corvi
* @date dec 2011
*
* @brief TopoDroid drawing: a point on a line
* --------------------------------------------------------
* Copyright This sowftare is distributed under GPL-3.0 or later
* See the file COPYING.
* --------------------------------------------------------
*/
package com.topodroid.DistoX;
import java.io.PrintWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Locale;
// import android.util.Log;
public class LinePoint extends BezierPoint
{
private static final float toTherion = TDConst.TO_THERION;
// public float mX;
// public float mY;
float mX1; // first control point (to the right of the previous LinePoint)
float mY1;
float mX2; // second control point (to the left of this LinePoint)
float mY2;
boolean has_cp;
LinePoint mPrev; // previous LinePoint on the line
LinePoint mNext; // next LinePoint on the line
void flipXAxis(float z)
{
float dx = 2 * DrawingUtil.CENTER_X;
mX1 = dx - mX1;
mX2 = dx - mX2;
mX = dx - mX;
}
void shiftCP1By( float dx, float dy )
{
mX1 += dx;
mY1 += dy;
}
void shiftCP2By( float dx, float dy )
{
mX2 += dx;
mY2 += dy;
}
void shiftBy( float dx, float dy )
{
mX += dx;
mY += dy;
if ( has_cp ) {
// mX1 += dx;
// mY1 += dy;
mX2 += dx;
mY2 += dy;
}
if ( mNext != null && mNext.has_cp ) {
mNext.mX1 += dx;
mNext.mY1 += dy;
}
}
// make isolated line-point copying coords from another
public LinePoint( LinePoint lp )
{
mX = lp.mX;
mY = lp.mY;
mX1 = lp.mX1;
mY1 = lp.mY1;
mX2 = lp.mX2;
mY2 = lp.mY2;
has_cp = false;
mNext = null;
mPrev = null;
}
public LinePoint( LinePoint lp, LinePoint prev )
{
mX = lp.mX;
mY = lp.mY;
mX1 = lp.mX1;
mY1 = lp.mY1;
mX2 = lp.mX2;
mY2 = lp.mY2;
has_cp = lp.has_cp;
mNext = null;
if ( prev != null ) prev.mNext = this;
mPrev = prev;
}
public LinePoint( float x, float y, LinePoint prev )
{
super( x, y );
// mX = x;
// mY = y;
has_cp = false;
mNext = null;
if ( prev != null ) prev.mNext = this;
mPrev = prev;
}
public LinePoint( float x1, float y1, float x2, float y2, float x, float y, LinePoint prev )
{
super( x, y );
// mX = x;
// mY = y;
mX1 = x1;
mY1 = y1;
mX2 = x2;
mY2 = y2;
has_cp = true;
mNext = null;
if ( prev != null ) prev.mNext = this;
mPrev = prev;
}
float distanceCP1( float x, float y )
{
return (float)Math.sqrt( (x-mX1)*(x-mX1) + (y-mY1)*(y-mY1) );
}
float distanceCP2( float x, float y )
{
return (float)Math.sqrt( (x-mX2)*(x-mX2) + (y-mY2)*(y-mY2) );
}
public void toTherion( PrintWriter pw )
{
if ( has_cp ) {
pw.format(Locale.US, " %.2f %.2f %.2f %.2f %.2f %.2f\n",
mX1*toTherion, -mY1*toTherion,
mX2*toTherion, -mY2*toTherion,
mX*toTherion, -mY*toTherion );
} else {
pw.format(Locale.US, " %.2f %.2f\n", mX*toTherion, -mY*toTherion );
}
}
void toDataStream( DataOutputStream dos )
{
try {
dos.writeFloat( mX );
dos.writeFloat( mY );
if ( has_cp ) {
dos.write( 1 );
dos.writeFloat( mX1 );
dos.writeFloat( mY1 );
dos.writeFloat( mX2 );
dos.writeFloat( mY2 );
} else {
dos.write( 0 );
}
} catch ( IOException e ) { }
}
}