2011-12-23 48 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

相關問題