Javascript arcTo有时不';我不会被你吸引

Javascript arcTo有时不';我不会被你吸引,javascript,canvas,qml,Javascript,Canvas,Qml,我有下面的QML文件,它绘制了一个绿色的圆(通过QML矩形),并在圆上绘制了一个黑色的弧(通过画布和arcTo)。圆的位置和半径取决于窗口的大小。对于大多数尺寸,这似乎工作得很好,但对于一些弧只是消失。复制行为的完整main.qml如下所示: import QtQuick 2.5 import QtQuick.Window 2.2 Window { visible: true height: 400 width: 400 Rectangle{ x

我有下面的QML文件,它绘制了一个绿色的圆(通过QML矩形),并在圆上绘制了一个黑色的弧(通过画布和arcTo)。圆的位置和半径取决于窗口的大小。对于大多数尺寸,这似乎工作得很好,但对于一些弧只是消失。复制行为的完整main.qml如下所示:

import QtQuick 2.5
import QtQuick.Window 2.2

Window {
    visible: true
    height: 400
    width: 400
    Rectangle{
        x:20
        y:20
        height: parent.height-40
        width: parent.width-40

        Rectangle{
            id:circle
            x:(parent.height<parent.width?parent.height:parent.width)/3
            y:x
            height:(parent.height<parent.width?parent.height:parent.width)/3
            width: height
            radius: height/2
            border.color: 'green'
        }

        Canvas{
            anchors.fill: parent
            visible: true
            onPaint: {
                var ctx = getContext("2d");
                ctx.strokeStyle = 'black';
                ctx.lineWidth = 4;
                var x = circle.x;
                var y = circle.y;
                var r = circle.radius;
                ctx.beginPath();
                ctx.moveTo(x,y+r);
                ctx.arcTo(x,y+2*r,x+r,y+2*r,r);
                ctx.stroke();

            }
        }
    }
}
导入QtQuick 2.5
导入QtQuick.Window 2.2
窗口{
可见:正确
身高:400
宽度:400
长方形{
x:20
y:20
身高:父母身高-40
宽度:parent.width-40
长方形{
id:圆圈

x:(parent.height在我看来像个bug。它似乎与传入的坐标有关:

import QtQuick 2.5
import QtQuick.Window 2.2

Window {
    id: window
    visible: true
    height: 400
    width: 400

    Rectangle {
        anchors.fill: parent
        anchors.margins: 20

        Canvas {
            anchors.fill: parent
            onPaint: {
                var ctx = getContext("2d")
                ctx.strokeStyle = 'black'
                ctx.lineWidth = 4
                var x = 0
                var y = 0
                var r = parent.height / 2
                ctx.beginPath()
                // Visible:
                ctx.moveTo(120.33333333333333, 180.5)
                ctx.arcTo(120.33333333333333, 240.66666666666666, 180.5, 240.66666666666666, 60.166666666666664)
                // Not visible:
//                ctx.moveTo(120.66666666666667, 181)
//                ctx.arcTo(120.66666666666667, 241.33333333333334, 181, 241.33333333333334, 60.333333333333336)
                ctx.stroke()
            }
        }
    }
}

在我看来是个bug。它似乎与传入的坐标有关:

import QtQuick 2.5
import QtQuick.Window 2.2

Window {
    id: window
    visible: true
    height: 400
    width: 400

    Rectangle {
        anchors.fill: parent
        anchors.margins: 20

        Canvas {
            anchors.fill: parent
            onPaint: {
                var ctx = getContext("2d")
                ctx.strokeStyle = 'black'
                ctx.lineWidth = 4
                var x = 0
                var y = 0
                var r = parent.height / 2
                ctx.beginPath()
                // Visible:
                ctx.moveTo(120.33333333333333, 180.5)
                ctx.arcTo(120.33333333333333, 240.66666666666666, 180.5, 240.66666666666666, 60.166666666666664)
                // Not visible:
//                ctx.moveTo(120.66666666666667, 181)
//                ctx.arcTo(120.66666666666667, 241.33333333333334, 181, 241.33333333333334, 60.333333333333336)
                ctx.stroke()
            }
        }
    }
}

我在坐标中添加了一个Math.floor来解决这个问题:var x=Math.floor(circle.x);var y=Math.floor(circle.y);var r=Math.floor(circle.radius)@ralgrad,你找到了一个解决办法,这很好。你能不能也创建一个bug报告?我认为整个问题是JavaScript中的舍入问题,如果值舍入错误,那么就不能再绘制圆弧了。我在坐标中添加了一个Math.floor来解决这个问题:var x=Math.floor(circle.x);var y=Math.floor(circle.y);var r=Math.floor(circle.radius);@ralgrad,你找到了一个解决方法,这很好。你能不能也创建一个bug报告?我认为整个问题都是JavaScript中的舍入问题,如果值舍入错误,就无法再绘制圆弧。