Java Android:不同坐标系下的画布缩放

Java Android:不同坐标系下的画布缩放,java,android,canvas,coordinates,scale,Java,Android,Canvas,Coordinates,Scale,我已经有点绝望了 我正在用Android在画布上画点和线。我显示的点应该显示在一个数学系统中。因此,我使用canvas.getHeight()-point.y以正确的方式显示点 但如果我想放大绘制的对象,y坐标将从视图中缩小。 那是因为x=10,y=700。如果我用10的比例因子缩放它,y会使对象消失。 我希望你明白我说的 如何以正确(数学)的方式显示坐标,而不将y坐标移动很远 以下是我的工作: canvas.drawPoint(startPoints[i][0], height

我已经有点绝望了

我正在用Android在画布上画点和线。我显示的点应该显示在一个数学系统中。因此,我使用canvas.getHeight()-point.y以正确的方式显示点

但如果我想放大绘制的对象,y坐标将从视图中缩小。 那是因为x=10,y=700。如果我用10的比例因子缩放它,y会使对象消失。 我希望你明白我说的

如何以正确(数学)的方式显示坐标,而不将y坐标移动很远

以下是我的工作:

        canvas.drawPoint(startPoints[i][0], height-startPoints[i][1], pointColor);
        canvas.drawPoint(endPoints[i][0], height-endPoints[i][1], pointColor);
然后我的点(x=10,y=10)将显示为x=10,y=714

这是我的全部程序

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    final float[][] startPoints;

    final float[][] endPoints;

    int count = 0;
    height = canvas.getHeight();

    canvas.save();
    canvas.scale(scaleFactor, scaleFactor);
    canvas.translate(translateX / scaleFactor, translateY / scaleFactor);

    Paint lineColor = new Paint();
    lineColor.setColor(Color.BLACK);

    Paint pointColor = new Paint();
    pointColor.setColor(Color.RED);
    pointColor.setStrokeWidth(5f);

    startPoints = data.getStartPoints();
    endPoints = data.getEndPoints();
    count = data.getSize();

    for (int i = 0; i < count; i++) {
        canvas.drawLine(startPoints[i][0], height-startPoints[i][1],
                endPoints[i][0], height-endPoints[i][1], lineColor);
        canvas.drawPoint(startPoints[i][0], height-startPoints[i][1], pointColor);
        canvas.drawPoint(endPoints[i][0], height-endPoints[i][1], pointColor);
    }

    canvas.restore();
}

private class ScaleListener extends
        ScaleGestureDetector.SimpleOnScaleGestureListener {
    @Override
    public boolean onScale(ScaleGestureDetector detector) {
        scaleFactor *= detector.getScaleFactor();
        scaleFactor = Math.max(MIN_ZOOM, Math.min(scaleFactor, MAX_ZOOM));
        return true;
    }
}
@覆盖
公共空白onDraw(画布){
super.onDraw(帆布);
最终浮动[][]起始点;
最终浮点[]端点;
整数计数=0;
高度=canvas.getHeight();
canvas.save();
scale(scaleFactor,scaleFactor);
canvas.translate(translateX/scaleFactor,translateY/scaleFactor);
绘制线条颜色=新绘制();
lineColor.setColor(Color.BLACK);
绘制点颜色=新绘制();
pointColor.setColor(Color.RED);
点颜色。设置行程宽度(5f);
startPoints=data.getStartPoints();
端点=data.getEndPoints();
count=data.getSize();
for(int i=0;i
比例因子x=屏幕宽度(像素)/目标宽度(像素)
比例因子y=屏幕高度(以像素为单位)/目标高度(以像素为单位)



缩放x点=调整大小画布上的x*(调整大小的宽度/原始宽度)

缩放的y点=调整大小的画布上的y*(调整大小的高度/原始高度)

我建议您熟悉画布的绘图坐标系,因为这在计算机图形学中非常常见,并且会使您的生活比尝试更改坐标系容易得多。我也不确定你是如何缩放的,这会使点消失。你能发布一些代码吗?我正在用ScaleGetureDetector进行缩放。我在下面发布了一些代码目标宽度和高度是指我正在缩放的手指之间的距离?目标宽度是调整大小之前的原始宽度,屏幕宽度是当前调整大小的宽度这不是问题。。。对x=1和y=500的点进行成像。您有一个显示400x700像素的屏幕。如果按2的比例因子缩放该点,则x=2,y=1000。所以这些点会被挤出画布,你必须向下平移到画布上。这就是我想要避免的我只需要找出如何翻转y值,这样我就不会得到镜像对象也许最好保持画布大小不变,并计算画布中绘制的位图的矩形和原点。因此,可以在不更改画布尺寸的情况下使用比例因子计算。我希望有帮助