2013-10-04 105 views
0

如何在应用graphics2d转换后获得线坐标?这里是代码:如何在Graphics2D中应用转换后获取线坐标?

double startX = 100; 
double startY = 100; 
double endX = 500; 
double endY = 500; 

AffineTransform rotation = new AffineTransform();  
double angle = Math.toRadians(90); 
rotation.rotate(angle, 200, 200); 

Graphics2D brush = (Graphics2D) g; 
Line2D.Double line = new Line2D.Double(startX, startY, endX, endY); 
brush.setTransform(rotation); 
brush.draw(line); 
+0

咦?如果转换正确且设置为图形实例,则应该能够使用任何所需方法的原始坐标,并且转换将自动完成。为了更快地获得更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+0

我不需要执行另一个转换。只需要在应用转换后的新坐标(x1,y1,x2,y2)。这将与变换之前的坐标有偏差。谢谢 – Adnan

+0

1)*“只需要新的坐标..”*没有意图的进攻,但我真的不在乎*你想要什么,我试图找出*为什么*你想要它。作为知道该信息的结果,您打算实施的应用程序功能是什么?可能比您现在尝试的更容易实现它。 2)你是否打算忽略发布SSCCE的建议?我希望能解释'为什么?'。请注意,如果您打算忽略它,那么'忽略'可以双向进行。这不是因为我没有其他事情要做,或其他人帮助.. –

回答

1

我没有看到任何“伟大”的方式做到这一点,但继承人我得到了什么。旋转后,您可以使用PathIterator对象来获取线条的结果。从那里,您可以循环访问PathIterator中的坐标并获取您的x和y坐标。

继承人有如果抓出来的坐标的更清洁的方式的awnser您感兴趣iterate through each point on a line/path in java

此外,如果你计划在任何类型的图形,我不会建议做你paint方法里这一过程的使用这个。

double startX = 100; 
double startY = 100; 
double endX = 500; 
double endY = 500; 

AffineTransform rotation = new AffineTransform();  
double angle = Math.toRadians(90); 
rotation.rotate(angle, 200, 200); 

Line2D.Double line = new Line2D.Double(startX, startY, endX, endY); 
PathIterator it = line.getPathIterator(rotation); 
while(!it.isDone()) { 
    double [] values = new double[6]; 
    it.currentSegment(values); 
    System.out.println("["+values[0] + ", " + values[1] + "]"); 
    it.next(); 
} 

另外我注意到一些关于使用路径而不是你的inital线的评论。我同意,当你需要将变换应​​用于“形状”时,应该使用路径,因为它们内置了处理它的方法。下面是使用路径代替Line2D的示例

double startX = 100; 
double startY = 100; 
double endX = 500; 
double endY = 500; 

AffineTransform rotation = new AffineTransform();  
double angle = Math.toRadians(90); 
rotation.rotate(angle, 200, 200); 

Path2D path = new Path2D.Double(); 
path.moveTo(startX, startY); 
path.lineTo(endX, endY); 

path.transform(rotation); 

double [] values = new double[6]; 
for(PathIterator it = path.getPathIterator(null); !it.isDone();) { 
    it.currentSegment(values); 
    System.out.println("["+values[0] + ", " + values[1] + "]"); 
    it.next(); 
}