2017-10-25 25 views
-1

JavaでDDAアルゴリズムを実装して線を描画しようとしています。ラインラスタライザはインターフェイスを実装します。次に、CanvaというクラスのrasterizeLine関数を呼び出します。 LineRasterizesはxとyの点を正常に取得します。エラーはスローされませんが、線が描画されていないため、アルゴリズムには論理的な問題があります。論理的な間違いを見つけるのを助けてくれますか?DDAアルゴリズムの実装

インタフェース

package rasterops; 

import rasterdata.RasterImage; 

public interface LineRasterizer<PixelType> { 
    RasterImage<PixelType> rasterizeLine(RasterImage<PixelType> img, 
        double x1, double y1, double x2, double y2, 
        PixelType value); 
} 

ラインラスタライザ

package rasterops; 

import rasterdata.RasterImage; 

public class LineRasterizerDDA<PixelType> implements LineRasterizer <PixelType> { 
    @Override 
    public RasterImage<PixelType> rasterizeLine(RasterImage<PixelType> img, double x1, double y1, double x2, double y2, PixelType value) { 


     double dy = y2-y1; 
     double dx = x2-x1; 

     double k = dy/dx; 
     double y = y1; 

     RasterImage<PixelType> result = img; 
     for(double x = x1; x <= x2; x++){ 
      result = result.withPixel((int)x, (int)Math.round(y), value); 
      y = y1 + k; 
     } 

     return result; 



    } 
} 

Canva - このリチウム

panel.addMouseListener(new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent e) { 
       previousX = e.getX(); 
       previousY = e.getY(); 
      } 
     }); 
     panel.addMouseMotionListener(new MouseAdapter() { 
      @Override 
      public void mouseDragged(MouseEvent e) { 
       final double startX = previousX/(panel.getWidth() - 1.0); //k zamysleni: proc 1.0 a ne 1? 
       final double startY = 1 - previousY/(panel.getHeight() - 1.0); 
       final double endX = e.getX()/(panel.getWidth() - 1.0); 
       final double endY = 1 - e.getY()/(panel.getHeight() - 1.0); 
       clear(); // zkuste zakomentovat 
       rasterImage = liner.rasterizeLine(rasterImage, 
         startX, startY, endX, endY, 
         0xffff00); 
       panel.repaint(); 
      } 
     }); 
+0

あなたは(https://stackoverflow.com/questions/46920911/finding-a-bug-in-an-algorithm)[すでにこの質問をしました]。 –

+0

@AndyTurner私は最初のものを削除しました。 – pajicekkralicek

+0

まあ、同じ理由で同様のコメントでこれを閉じると考えています。 [なぜ誰かが私を助けることができるのですか?実際の質問ではありませんか?](https://meta.stackoverflow.com/q/284236/3788176) –

答えて

3

関数を呼び出しますNE:

y = y1 + k; 

y1kが変更されていないため、yに同じ値を割り当てる続けます。

Example output, drawing line between (0,0) and (10, 10)

O.......... 
.OOOOOOOOOO 
........... 
........... 
........... 
........... 
........... 
........... 
........... 
........... 
........... 

あなたは意味があります。

y = y + k; 

またはy += k;

Example output, drawing line between (0,0) and (10, 10)

O.......... 
.O......... 
..O........ 
...O....... 
....O...... 
.....O..... 
......O.... 
.......O... 
........O.. 
.........O. 
..........O 
+1

疑問のある質問を保存してください。 +1 – Prune