如何旋转基于度给定数量的线(How to rotate a line based on a give

2019-10-22 19:56发布

我有一个图形对象绘制的线。 我想根据鼠标多少拖到旋转此行一定的度。 我可以得到我度需要旋转它的数量,但我怎么然后旋转基于该行?

谢谢!

Answer 1:

您可以创建一个Line2D的原装线对象。 然后你可以使用AffineTransform#getRotateInstance获得AffineTransform ,做约一定角度的旋转,围绕某一点。 使用此AffineTransform ,你可以创建一个旋转Line2D对象作画。 所以,你的画的代码可以大致是这样的:

protected void paintComponent(Graphics gr) {
    super.paintComponent(gr);
    Graphics2D g = (Graphics2D)gr; 

    // Create the original line, starting at the origin,
    // and extending along the x-axis
    Line2D line = new Line2D.Double(0,0,100,0);

    // Obtain an AffineTransform that describes a rotation
    // about a certain angle (given in radians!), around
    // the start point of the line. (Here, this is the
    // origin, so this could be simplified. But in this
    // form, it's more generic)
    AffineTransform at = 
        AffineTransform.getRotateInstance(
            Math.toRadians(angleInDegrees), line.getX1(), line.getY1());

    // Draw the rotated line
    g.draw(at.createTransformedShape(line));
}


Answer 2:

好吧,你需要计算线的长度,假设线的末端是(X0,Y0)和(X1,Y1)和(x,y)是鼠标坐标,你想要的是点(X2,Y2),其是在(X0,Y0)和(X,Y)之间的线路,(X0,Y0)和(X2,Y2)之间的距离必须是相同的(X0,Y0)之间的一个(X1,Y1)。

(X0,Y0)和(X1,Y1)之间的距离是:

double dx = x1-x0;
double dy = y1-y0;
double length = Math.sqrt(dx*dx, dy*dy);

(X0,Y0)和(X,Y)之间的距离是:

double dx1 = x-x0;
double dy1 = y-y0;
double mouseDist = Math.sqrt(dx1*dx1, dy1*dy1);

和(x2,y2)的有:

int x2 = x0 + (int)(dx1*length/mouseDist);
int y2 = y0 + (int)(dy1*length/mouseDist);


Answer 3:

我想你是在谈论的Java AWT Graphics类。 图形可以被看作是一个画布。 它的像素值的阵列和“画线”只是一个效用函数改变的一些像素的值 - 没有“线对象”可言,从它的角度。 通常情况下,你应该删除整个事情并绘制你想要的角度一个新行。 然而,对于这一点,你可能想看看的Graphics2D( http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics2D.html ),尤其是在一个setTransform和AffineTransform类。



Answer 4:

static Point rotateLineClockWise(Point center, Point edge, int angle) {
    double xRot = (int) center.x + Math.cos(Math.toRadians(angle)) * (edge.x - center.x) - Math.sin(Math.toRadians(angle)) * (edge.y - center.y);
    double yRot = (int) center.y + Math.sin(Math.toRadians(angle)) * (edge.x - center.x) + Math.cos(Math.toRadians(angle)) * (edge.y - center.y);
    return new Point((int) xRot, (int) yRot);
}


文章来源: How to rotate a line based on a given number of degrees