在此示例中,您可以了解如何:
- 在相对坐标中放置一个点,放置在屏幕上相同的相对位置
- 在绝对坐标中放置一个点,放置在屏幕上相同的相对位置
无论宽高比差异如何,事物都会以相对的方式正确定位。
接下来你想要的是一个统一的比例,这里是 X/Y 的最小值,但你也可以强制它在一个特定的轴上。
此外,您想要的矩阵可能是:缩放、旋转、平移。
您可能希望将所有这些调整为您真正想要的。
结果:
resolution: <960, 540>, pointRelative: <480.000, 270.000>, pointAbsolute: <50.000, 50.000>, scaleAbsolute: <0.500, 0.500>, scaleUniform: 0.500
resolution: <960, 680>, pointRelative: <480.000, 340.000>, pointAbsolute: <50.000, 62.963>, scaleAbsolute: <0.500, 0.630>, scaleUniform: 0.500
resolution: <960, 720>, pointRelative: <480.000, 360.000>, pointAbsolute: <50.000, 66.667>, scaleAbsolute: <0.500, 0.667>, scaleUniform: 0.500
resolution: <960, 768>, pointRelative: <480.000, 384.000>, pointAbsolute: <50.000, 71.111>, scaleAbsolute: <0.500, 0.711>, scaleUniform: 0.500
resolution: <960, 1024>, pointRelative: <480.000, 512.000>, pointAbsolute: <50.000, 94.815>, scaleAbsolute: <0.500, 0.948>, scaleUniform: 0.500
resolution: <960, 1080>, pointRelative: <480.000, 540.000>, pointAbsolute: <50.000, 100.000>, scaleAbsolute: <0.500, 1.000>, scaleUniform: 0.500
resolution: <1280, 540>, pointRelative: <640.000, 270.000>, pointAbsolute: <66.667, 50.000>, scaleAbsolute: <0.667, 0.500>, scaleUniform: 0.500
resolution: <1280, 680>, pointRelative: <640.000, 340.000>, pointAbsolute: <66.667, 62.963>, scaleAbsolute: <0.667, 0.630>, scaleUniform: 0.630
resolution: <1280, 720>, pointRelative: <640.000, 360.000>, pointAbsolute: <66.667, 66.667>, scaleAbsolute: <0.667, 0.667>, scaleUniform: 0.667
resolution: <1280, 768>, pointRelative: <640.000, 384.000>, pointAbsolute: <66.667, 71.111>, scaleAbsolute: <0.667, 0.711>, scaleUniform: 0.667
resolution: <1280, 1024>, pointRelative: <640.000, 512.000>, pointAbsolute: <66.667, 94.815>, scaleAbsolute: <0.667, 0.948>, scaleUniform: 0.667
resolution: <1280, 1080>, pointRelative: <640.000, 540.000>, pointAbsolute: <66.667, 100.000>, scaleAbsolute: <0.667, 1.000>, scaleUniform: 0.667
resolution: <1366, 540>, pointRelative: <683.000, 270.000>, pointAbsolute: <71.146, 50.000>, scaleAbsolute: <0.711, 0.500>, scaleUniform: 0.500
resolution: <1366, 680>, pointRelative: <683.000, 340.000>, pointAbsolute: <71.146, 62.963>, scaleAbsolute: <0.711, 0.630>, scaleUniform: 0.630
resolution: <1366, 720>, pointRelative: <683.000, 360.000>, pointAbsolute: <71.146, 66.667>, scaleAbsolute: <0.711, 0.667>, scaleUniform: 0.667
resolution: <1366, 768>, pointRelative: <683.000, 384.000>, pointAbsolute: <71.146, 71.111>, scaleAbsolute: <0.711, 0.711>, scaleUniform: 0.711
resolution: <1366, 1024>, pointRelative: <683.000, 512.000>, pointAbsolute: <71.146, 94.815>, scaleAbsolute: <0.711, 0.948>, scaleUniform: 0.711
resolution: <1366, 1080>, pointRelative: <683.000, 540.000>, pointAbsolute: <71.146, 100.000>, scaleAbsolute: <0.711, 1.000>, scaleUniform: 0.711
resolution: <1920, 540>, pointRelative: <960.000, 270.000>, pointAbsolute: <100.000, 50.000>, scaleAbsolute: <1.000, 0.500>, scaleUniform: 0.500
resolution: <1920, 680>, pointRelative: <960.000, 340.000>, pointAbsolute: <100.000, 62.963>, scaleAbsolute: <1.000, 0.630>, scaleUniform: 0.630
resolution: <1920, 720>, pointRelative: <960.000, 360.000>, pointAbsolute: <100.000, 66.667>, scaleAbsolute: <1.000, 0.667>, scaleUniform: 0.667
resolution: <1920, 768>, pointRelative: <960.000, 384.000>, pointAbsolute: <100.000, 71.111>, scaleAbsolute: <1.000, 0.711>, scaleUniform: 0.711
resolution: <1920, 1024>, pointRelative: <960.000, 512.000>, pointAbsolute: <100.000, 94.815>, scaleAbsolute: <1.000, 0.948>, scaleUniform: 0.948
resolution: <1920, 1080>, pointRelative: <960.000, 540.000>, pointAbsolute: <100.000, 100.000>, scaleAbsolute: <1.000, 1.000>, scaleUniform: 1.000
代码:
public void Test()
{
var sx = new[] { 1920, 1366, 1280, 960 };
var sy = new[] { 1080, 1024, 768, 720, 680, 540 };
var pt1 = new Vector2(0.5f, 0.5f);
var pt2 = new Vector2(100, 100);
foreach (var w in sx.Reverse())
{
foreach (var h in sy.Reverse())
{
var scaleX = w / 1920.0f;
var scaleY = h / 1080.0f;
var resolution = new Vector2(w, h);
var scaleUniform = Math.Min(scaleX, scaleY);
var scaleAbsolute = new Vector2(scaleX, scaleY);
var pointRelative = pt1 * resolution;
var pointAbsolute = pt2 * scaleAbsolute;
Console.WriteLine(
$"{nameof(resolution)}: {resolution,12}, " +
$"{nameof(pointRelative)}: {pointRelative,20:F3}, " +
$"{nameof(pointAbsolute)}: {pointAbsolute,20:F3}, " +
$"{nameof(scaleAbsolute)}: {scaleAbsolute:F3}, " +
$"{nameof(scaleUniform)}: {scaleUniform:F3}"
);
}
}
}