2011-12-23 47 views
0

这实际上是我们的论文中,我们需要使用道格拉斯 - 普克算法在简化的线条,可以anyboy帮助我如何实现这一个Android应用程序。Android:如何从绘制的线中获取点的字符串?

我只是想知道如何让我画从线点串并通过减少总没有简化线。基于下面给出的代码点?

这是主类。

public class SketchTimeNewActivity extends GraphicsView implements ColorOption.OnColorChangedListener { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(new MyView(this)); 

    myPaint = new Paint(); 
    myPaint.setAntiAlias(true); 
    myPaint.setDither(true); 
    myPaint.setColor(Color.CYAN); 
    myPaint.setStyle(Paint.Style.STROKE); 
    myPaint.setStrokeJoin(Paint.Join.ROUND); 
    myPaint.setStrokeCap(Paint.Cap.ROUND); 
    myPaint.setStrokeWidth(12); 
} 

private Paint  myPaint;  

    public void colorChanged(int color) { 
    myPaint.setColor(color); 
} 


public class MyView extends View { 

    private static final float MINP = 0.25f; 
    private static final float MAXP = 0.75f; 

    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    private Paint mBitmapPaint; 

    public MyView(Context c) { 
     super(c); 

     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
    } 

    @Override 
    protected void onSizeChanged(int width, int height, int oldwidth, int oldheight) { 
     super.onSizeChanged(width, height, oldwidth, oldheight); 
     mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     mCanvas = new Canvas(mBitmap); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(color.black); 

     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     canvas.drawPath(mPath, myPaint); 
    } 

    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 4; 

    private void touch_start(float x, float y) { 
     mPath.reset(); 
     mPath.moveTo(x, y); 
     mX = x; 
     mY = y; 
    } 
    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, myPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       touch_start(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_MOVE: 
       touch_move(x, y); 
       invalidate(); 
       break; 
      case MotionEvent.ACTION_UP: 
       touch_up(); 
       invalidate(); 
       break; 
     } 
     return true; 
    } 
} 

private static final int COLOR_MENU_ID = Menu.FIRST; 
private static final int EXISTING_MENU_ID = Menu.FIRST + 2; 
private static final int ENHANCED_MENU_ID = Menu.FIRST + 3; 
private static final int ERASE_MENU_ID = Menu.FIRST + 1; 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 

    menu.add(0, COLOR_MENU_ID, 0, "Color").setShortcut('1', 'c'); 
    menu.add(0, EXISTING_MENU_ID, 0, "Enhanced").setShortcut('2', 's'); 
    menu.add(0, ENHANCED_MENU_ID, 0, "Existing").setShortcut('3', 'z'); 
    menu.add(0, ERASE_MENU_ID, 0, "Erase").setShortcut('4', 'z'); 

    return true; 
} 



@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    super.onPrepareOptionsMenu(menu); 
    return true; 
} 



@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    myPaint.setXfermode(null); 
    myPaint.setAlpha(0xFFAAAAAA); 

当点击了现有的菜单,这将简化被绘制的线,并显示具有更小的点,或者已经简化一个线的线。我打算为它创建一个新类,但我不知道如何从画布中绘制的线中获取点串。

switch (item.getItemId()) { 

     case COLOR_MENU_ID: 
      new ColorOption(this, this, myPaint.getColor()).show(); 
      return true; 

    /**  case EXISTING_MENU_ID: 

      return true; 

     case ENHANCED_MENU_ID: 

      return true;*/ 

     case ERASE_MENU_ID:{ 

        myPaint.setColor(color.black); 
        myPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
        return true; 
       } 

    } 

    return super.onOptionsItemSelected(item); 
} 

} 
+0

您正在从'onTouchEvent'生成线上的点,所以不是试图在之后查询Canvas,为什么不简单地保留这些创建点的列表?您可以在绘制每个新线段时添加一个点。 – 2011-12-23 07:52:06

+0

非常感谢您的帮助。你能否请进一步解释我将如何去做?非常感谢, – user1081908 2011-12-23 14:29:44

+0

当你说这是你的论文时,你的意思是说它是作业吗? – Zoot 2011-12-23 16:29:20

回答

0

从我原来的一些背景注释复制粘贴:

你是在试图查询帆布代替从您的onTouchEvent线产生的点,所以 后来,为什么不干脆保存 这些创建点的列表?您可以在绘制每个新线段时添加一个点。

在代码方面,你的最基本的例子将是这个样子:

List<Point> mPoints = new ArrayList<Point>(); 

private void touch_up() { 
    // save this point on the line 
    mPoints.add(new Point(mX, mY); 
    // add point to path 
    mPath.lineTo(mX, mY); 
    // commit the path to our offscreen 
    mCanvas.drawPath(mPath, myPaint); 
    // kill this so we don't double draw 
    mPath.reset(); 
} 

我在这里假设touch_up()是你每个线段的起点或终点的路径添加到。

//编辑:当您再次阅读您的问题时,我觉得您可能会要求全部点您所绘制的线上 - 因为您的代码段包含曲线?我的猜测是,实现这一点的唯一方法是使用不同的基础数学方程评估每个(x,y)并存储每个点的结果。换句话说:通过编写自己的lineTo和quadTo函数。

对于直线,这是相对平凡的,但曲线会增加难度。您可能需要查看Path的源代码,该代码将其大部分工作内部委托给一个java.awt.geom.GeneralPath对象。

+0

是的,这涉及曲线,所以这意味着我必须创建或应用一些数学方程来获得所有点的线? – user1081908 2011-12-25 08:43:20

+0

那么,我会说这是你最好和最快的选择,尽管可能不是最容易实现的。或者,您可以通过在绘制完所有屏幕像素之后重复执行某种“逼近”操作,并检查您正在绘制的颜色。但是,这不会给你任何关于绘图顺序的信息。如果线条没有交叉,你可以很容易地加强这一点,因为你至少知道每条线段的起点和终点,但它不会像使用数学那样整齐。 – 2011-12-25 09:04:56

+0

谢谢。但我真的觉得很难开始,请给我一个示例代码..或者检查我的代码,我将如何实现它?再次感谢您的帮助,我非常感激。 – user1081908 2011-12-25 15:17:21

相关问题