我正在尝试编写应用内操纵杆轴校准工具。
操纵杆轴区域应该是一个矩形,但实际上它是一条非线性闭合曲线,我想提高精度。
校准应该这样工作: 我们有一个测量值,这样我们就得到了正确的值:
Correct value = [(measured value)/range] * wantedrange
其中range是该轴测量的最大值和最小值之间的差值。 但是还有一个偏移将中心点移动到正确的位置,如何计算它?
编辑:我也做了一个图像:绿色矩形是预期的区域,红色的形状是“真实的”不准确的测量区域,最后蓝色是我转移到的所需校准区域(0, 0)这样我就可以使用比率将坐标转换为更大的绿色矩形。
EDIT2: 该图片解释了zapl答案如何使校准更加准确: 如果我们找到蓝色矩形中心,我们可以将矩形划分为4个矩形,并计算该范围与绿色矩形范围之间的比率。 代码应该是这样的:
if(value<axiscenter) correctedvalue = ((value-axismin)/(axiscenter-axismin)) * wantedaxisrange;
else correctedvalue = wantedaxisrange + ((value-offset-axiscenter)/(axismax-axiscenter-axismin)) * wantedaxisrange;
答案 0 :(得分:1)
您可以通过指示用户沿着边缘移动操纵杆来获取蓝色矩形的位置,以便您看到的值是红色曲线。您还应该指示用户将操纵杆置于中心位置,因为您通常需要知道中心。计算中心并不总是真正的中心位置。
对于每个轴,将这些值分隔在它们所在的中心一侧,并找到最接近中心点的那些值。这适用于计算中心。现在你有了蓝色矩形。
E.g。在X轴上,您可以看到0-20和80-100之间的值,中心是~50&gt;蓝色矩形是20 - 80。
假设您要校准它以使值为0-100(绿色),则计算x轴的校正为
calibratedX = (uncalibrated - 20) * 100 / 60
值向右移动20(-20将它们标准化为0-60),它们的范围是60(80 - 20),您希望将其放大到0-100。之后该剪辑的值为0-100,因为它们将位于蓝色矩形之外的红线上的每个点之外。
结果类似于
其中粉红色是变换后的值,绿色矩形外的粉红色区域被切除。
关于中心点:也可以通过这些计算来运行。