QPainterPath元素的百分比/吨值

时间:2018-09-04 03:13:15

标签: python-2.7 qt pyqt pyqt4

我有一个QPainterPath,其中包含两个Elements,它们都是三次贝塞尔曲线,如下所示:

如果要在路径上查找特定点,可以使用pointAtPercent方法。该文档指出

  

存在曲线时,百分比参数将映射到Bezier方程的t参数。

enter image description here

当我得到百分比时,沿 entire 路径的长度从0到1。例如,该中间控制点在t = 0.46处,而实际上它是左元素的结尾(t = 1.0)和下一个元素的起点(t = 0)。因此,在我的图像中,如果我将百分比表示为绿色圆圈,则该百分比约为0.75。我想 是将绿色圆圈的值设为0.5,即仅第二个贝塞尔曲线的百分比。

所以我的问题是,Qt中是否有一种方法可以确定给定Element的百分比值,而不是相对于整个路径长度的百分比?在我的示例中,我碰巧知道中间控制点的百分比值,但是通常我不知道,所以我不能只是缩放百分比或假设分布均匀。

如果重要的话,我正在使用PyQt4(Qt 4.8)。谢谢!

1 个答案:

答案 0 :(得分:1)

t沿总length()缩放,但您也可以知道各个段的长度,从而相应地调整t。路径的 是一个相当具体的术语:假设cubicTo的每个位置没有中间位置变化,每个元素MoveToElement有3个元素。像您这样的任意路径包含CurveToElementCurveToDataElement,两个CurveToElement,另一个CurveToDataElement,另外两个t。您必须迭代元素并提取第一个立方的长度,以调整t2

一个函数提取第一个三次方,确定其长度,然后使用该函数从t中计算def t2(path, t): if path.elementCount() != 7: raise ValueError('invalid path element count') path1 = QPainterPath() path1.moveTo(path.elementAt(0)) path1.cubicTo(path.elementAt(2), path.elementAt(3), path.elementAt(1)) l = path.length() l1 = path1.length() l2 = l - l1 t2 = (t*l - l1)/l2 return t2 ,该函数看起来类似于(未经测试的):

(function ( $ ) {
$( 'document' ).ready( function() {
    $('#check-all').change(function () {
        if (this.checked){
            $("#delete-button").removeAttr('disabled');
            $(".checkSingle").each(function() {
                this.checked=true;
            })
        } else {
            $(".checkSingle").each(function() {
                $('#delete-button').attr('disabled', 'disabled');
                this.checked=false;
            })
        }
    });
    $(".checkSingle").click(function () {
        if ($(this).is(":checked")) {
            var isAllChecked = 0;
            $(".checkSingle").each(function() {
                if(!this.checked)
                    isAllChecked = 1;
            })
            if(isAllChecked == 0) {
                $("#check-all").prop("checked", true);
            }
        } else {
            $("#check-all").prop("checked", false);
        }
        var checked = false;
        $(".checkSingle").each(function() {
            if(this.checked){
                checked = true;
            }
        });

        if(checked){
            $("#delete-button").removeAttr('disabled');
        } else {
            $('#delete-button').attr('disabled', 'disabled');
        }
    });
});
})( jQuery );