我有一个QPainterPath,其中包含两个Elements,它们都是三次贝塞尔曲线,如下所示:
如果要在路径上查找特定点,可以使用pointAtPercent
方法。该文档指出
存在曲线时,百分比参数将映射到Bezier方程的t参数。
当我得到百分比时,沿 entire 路径的长度从0到1。例如,该中间控制点在t = 0.46处,而实际上它是左元素的结尾(t = 1.0)和下一个元素的起点(t = 0)。因此,在我的图像中,如果我将百分比表示为绿色圆圈,则该百分比约为0.75。我想 是将绿色圆圈的值设为0.5,即仅第二个贝塞尔曲线的百分比。
所以我的问题是,Qt中是否有一种方法可以确定给定Element的百分比值,而不是相对于整个路径长度的百分比?在我的示例中,我碰巧知道中间控制点的百分比值,但是通常我不知道,所以我不能只是缩放百分比或假设分布均匀。
如果重要的话,我正在使用PyQt4(Qt 4.8)。谢谢!
答案 0 :(得分:1)
t
沿总length()
缩放,但您也可以知道各个段的长度,从而相应地调整t
。路径的 是一个相当具体的术语:假设cubicTo
的每个位置没有中间位置变化,每个元素MoveToElement
有3个元素。像您这样的任意路径包含CurveToElement
,CurveToDataElement
,两个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 );