java - 计算直线的斜率(如果它是无穷大)

标签 java android canvas line paint

我正在用 Java(尤其是 Android)制作显示如下内容的东西:

enter image description here

用户可以拖动框的角,正如预期的那样,虚线应相应移动,始终有 3 条水平线(一条在中间,一条在顶部和底部之间,一条在 25% 处,一条在 75% 处)和3条垂直线。然而,如果左边缘或右边缘是无穷大(当用户第一次看到屏幕时),它看起来像这样:

enter image description here

如何更改我的代码,以便考虑到无限斜率边缘并仍然显示所需的屏幕?这是我的代码,用于检测虚线的位置、它们的斜率,最后将它们绘制到屏幕上。

//get edge slopes to calculate dashed lines
//c1X is the top left corner X position, c2X is for the top right corner, etc.
            float topLineSlope = (c2Y - c1Y)/(c2X - c1X);
            float rightLineSlope = (c3Y - c2Y)/(c3X - c2X);
            float bottomLineSlope = (c4Y - c3Y)/(c4X - c3X);
            float leftLineSlope = (c1Y - c4Y)/(c1X - c4X);


            //b in y=mx+b
            float topLineB = c1Y - (topLineSlope * c1X);
            float rightLineB = c2Y - (rightLineSlope * c2X);
            float bottomLineB = c3Y - (bottomLineSlope * c3X);
            float leftLineB = c4Y - (leftLineSlope * c4X);

            //final dashed line coordinates
            float topLineMiddleX = (c1X + c2X) / 2.0f;
            float topLineMiddleY = topLineSlope * topLineMiddleX + topLineB;
            float bottomLineMiddleX = (c3X + c4X) / 2.0f;
            float bottomLineMiddleY = bottomLineSlope * bottomLineMiddleX + bottomLineB;
            float leftLineMiddleX = (c4X + c1X) / 2.0f;
            float leftLineMiddleY = leftLineSlope * leftLineMiddleX + leftLineB;
            float rightLineMiddleX = (c2X + c3X) / 2.0f;
            float rightLineMiddleY = rightLineSlope * rightLineMiddleX + rightLineB;

            float topLineLeftX = (c1X + topLineMiddleX) / 2.0f;
            float topLineLeftY = topLineSlope * topLineLeftX + topLineB;
            float bottomLineLeftX = (c4X + bottomLineMiddleX) / 2.0f;
            float bottomLineLeftY = bottomLineSlope * bottomLineLeftX + bottomLineB;
            float topLineRightX = (topLineMiddleX + c2X) / 2.0f;
            float topLineRightY = topLineSlope * topLineRightX + topLineB;
            float bottomLineRightX = (c3X + bottomLineMiddleX) / 2.0f;
            float bottomLineRightY = bottomLineSlope * bottomLineRightX + bottomLineB;

            float leftLineTopX = (c1X + leftLineMiddleX) / 2.0f;
            float leftLineTopY = leftLineSlope * leftLineTopX + leftLineB;
            float rightLineTopX = (c2X + rightLineMiddleX) / 2.0f;
            float rightLineTopY = rightLineSlope * rightLineTopX + rightLineB;
            float leftLineBottomX = (leftLineMiddleX + c4X) / 2.0f;
            float leftLineBottomY = leftLineSlope * leftLineBottomX + leftLineB;
            float rightLineBottomX = (c3X + rightLineMiddleX) / 2.0f;
            float rightLineBottomY = rightLineSlope * rightLineBottomX + rightLineB;

            canvas.drawLine(topLineMiddleX, topLineMiddleY, bottomLineMiddleX, bottomLineMiddleY, dashedLine);
            canvas.drawLine(leftLineMiddleX, leftLineMiddleY, rightLineMiddleX, rightLineMiddleY, dashedLine);
            canvas.drawLine(topLineLeftX, topLineLeftY, bottomLineLeftX, bottomLineLeftY, dashedLine);
            canvas.drawLine(topLineRightX, topLineRightY, bottomLineRightX, bottomLineRightY, dashedLine);
            canvas.drawLine(leftLineTopX, leftLineTopY, rightLineTopX, rightLineTopY, dashedLine);
            canvas.drawLine(leftLineBottomX, leftLineBottomY, rightLineBottomX, rightLineBottomY, dashedLine);

最佳答案

如果您不使用直线或斜率方程,这将非常容易。您所做的是通过查找 x 坐标对的平均值来计算所有 x 坐标。然后,您将这些 x 坐标代入了边的方程式。正如您所确定的,如果斜率是无限的,这将不起作用。有一个非常简单的解决方案。您所要做的就是按照与计算 x 坐标完全相同的方式计算 y 坐标,问题就会消失。

关于java - 计算直线的斜率(如果它是无穷大),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27812142/

相关文章:

javascript - Sketch.js如何导出/导入数据(导入为图像,透明线不透明)

java - 尝试根据另一个数组字母顺序对数组进行排序

java - 如何在递归中做一次性的事情?

windows - 执行 .sh 文件的 Java 代码

android - 删除 Android EditText 上的左侧填充

canvas - 当 "globalCompositionOperation"为 false 时,使用 'source-atop' 设置为 "objectCaching"的屏蔽不起作用

Javascript 在 Canvas 上生成点字体

java - 单击按钮时,关闭应用程序 Java GUI

使用 Visa QRParser-2.2.0 和 minSdkVersion 19 的 Android 构建失败(transformClassesWithDesugar)

安卓-黑莓 GCM : Can't register ported android app to GCM services