Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在TCL中求和坐标_Tcl_Coordinates - Fatal编程技术网

如何在TCL中求和坐标

如何在TCL中求和坐标,tcl,coordinates,Tcl,Coordinates,我有一个包含x、y、z坐标的数据文件(*.dat)。详情如下: {26.3612117767334 40.19668960571289 54.13957977294922} {27.351043701171875 40.57518768310547 54.05387496948242} {29.48208999633789 42.08218765258789 56.42238235473633} 对于该文件,我需要进行如下数学运算: Xi + (Xf-Xi/4) ; Yi + (Yf-Yi/4

我有一个包含x、y、z坐标的数据文件(*.dat)。详情如下:

{26.3612117767334 40.19668960571289 54.13957977294922}
{27.351043701171875 40.57518768310547 54.05387496948242}
{29.48208999633789 42.08218765258789 56.42238235473633}
对于该文件,我需要进行如下数学运算:

Xi + (Xf-Xi/4) ; Yi + (Yf-Yi/4) ; Zi + (Zf-Zi/4)

“I”是“初始”位置,“F”是“最后”,意思是席、彝、子是第一线的数据,第二行的数据是XF、YF、ZF。


我需要对一个循环中的所有行进行这些计算,然后存储在一个单独的文件中,但我不知道如何在TCL中进行计算。提前感谢您的帮助。

由于您的文件内容可以被视为一组tcl列表,每行一个(因此基本上是列表列表列表),因此解析非常简单

比如:

set f [open file.dat]
set coords [read -nonewline $f]
close $f

for {set i 0} {$i < [llength $coords] - 1} {incr i} {
    lassign [lindex $coords $i] xi yi zi
    lassign [lindex $coords $i+1] xf yf zf
    set xn [expr {$xi + ($xf - $xi/4.0)}]
    set yn [expr {$yi + ($yf - $yi/4.0)}]
    set zn [expr {$zi + ($zf - $zi/4.0)}]
    puts "{$xn $yn $zn}"
}
set f[open file.dat]
设置坐标[read-nonewline$f]
收盘价$f
对于{set i 0}{$i<[l长度$coords]-1}{incr i}{
LeAdv[Link DeCouds$i ]席一子
lassign[lindex$coords$i+1]xf yf zf
集合xn[expr{$xi+($xf-$xi/4.0)}]
set yn[expr{$yi+($yf-$yi/4.0)}]
集合zn[expr{$zi+($zf-$zi/4.0)}]
放置“{$xn$yn$zn}”
}

这跳过了将最后一行作为初始坐标集的处理,因为它没有下一个坐标集。

因为文件的内容可以被视为一组tcl列表,每行一个(因此基本上是一个列表列表),解析它非常简单

比如:

set f [open file.dat]
set coords [read -nonewline $f]
close $f

for {set i 0} {$i < [llength $coords] - 1} {incr i} {
    lassign [lindex $coords $i] xi yi zi
    lassign [lindex $coords $i+1] xf yf zf
    set xn [expr {$xi + ($xf - $xi/4.0)}]
    set yn [expr {$yi + ($yf - $yi/4.0)}]
    set zn [expr {$zi + ($zf - $zi/4.0)}]
    puts "{$xn $yn $zn}"
}
set f[open file.dat]
设置坐标[read-nonewline$f]
收盘价$f
对于{set i 0}{$i<[l长度$coords]-1}{incr i}{
LeAdv[Link DeCouds$i ]席一子
lassign[lindex$coords$i+1]xf yf zf
集合xn[expr{$xi+($xf-$xi/4.0)}]
set yn[expr{$yi+($yf-$yi/4.0)}]
集合zn[expr{$zi+($zf-$zi/4.0)}]
放置“{$xn$yn$zn}”
}

这跳过了将最后一行视为初始坐标集的步骤,因为没有下一个坐标集。

我提出了一种替代方法,使用
lrange
拾取参与的子列表的重叠范围(这样我们就可以按元素处理它们)然后
lmap
对每个坐标轴应用相同的变换表达式

#与肖恩的答案相同的读入代码;这是最简单的方法
set f[打开文件.dat]
设置坐标[read-nonewline$f]
收盘价$f
foreach Ci[lrange$coords 0 end-1]Cf[lrange$coords 1 end]{
#为了清晰起见,我经常喜欢在自己的台词上加上表达
puts[list[lmap{i$Ci}f$Cf{expr{
$\U i+($\U f-$\U i/4.0)
}}]]
}

(在那里包装
列表
调用在
lmap
的结果周围放上大括号)

我提出了一种替代方法,使用
lrange
来选择参与的子列表的重叠范围(这样我们就可以按元素处理它们)然后
lmap
对每个坐标轴应用相同的变换表达式

#与肖恩的答案相同的读入代码;这是最简单的方法
set f[打开文件.dat]
设置坐标[read-nonewline$f]
收盘价$f
foreach Ci[lrange$coords 0 end-1]Cf[lrange$coords 1 end]{
#为了清晰起见,我经常喜欢在自己的台词上加上表达
puts[list[lmap{i$Ci}f$Cf{expr{
$\U i+($\U f-$\U i/4.0)
}}]]
}

(在那里包装
列表
调用会在
lmap
的结果周围加上大括号)

这是编写mathfunc的好机会:

proc tcl::mathfunc::f {ai af} {
    expr {$ai * 0.75 + $af}
}

proc transform {file} {
    set fh [open $file]

    # read the first line, aka the initial "previous line"
    gets $fh line
    scan $line {{%f %f %f}} xi yi zi

    # process the rest of the file
    while {[gets $fh line] != -1} {
        scan $line {{%f %f %f}} xf yf zf
        puts "{[expr {f($xi, $xf)}] [expr {f($yi, $yf)}] [expr {f($zi, $zf)}]}"
        lassign [list $xf $yf $zf] xi yi zi
    }

    close $fh
}

transform file.dat
输出

{47.12195253372192470.7227048873901494.65855979919434]}
{49.9953727722168 72.51357841491699 96.96278858184814]}

这是编写mathfunc的好机会:

proc tcl::mathfunc::f {ai af} {
    expr {$ai * 0.75 + $af}
}

proc transform {file} {
    set fh [open $file]

    # read the first line, aka the initial "previous line"
    gets $fh line
    scan $line {{%f %f %f}} xi yi zi

    # process the rest of the file
    while {[gets $fh line] != -1} {
        scan $line {{%f %f %f}} xf yf zf
        puts "{[expr {f($xi, $xf)}] [expr {f($yi, $yf)}] [expr {f($zi, $zf)}]}"
        lassign [list $xf $yf $zf] xi yi zi
    }

    close $fh
}

transform file.dat
输出

{47.12195253372192470.7227048873901494.65855979919434]}
{49.9953727722168 72.51357841491699 96.96278858184814]}

当最后一个元素是初始元素时,最后一个元素的最终位置是什么?在第一步中,第1行和第2行分别是初始和最终位置,在第二步中,第2行和第3行是初始和最终位置,依此类推,就像一个循环。例如:X首字母和最终字母的前26.31和27.351;第二个27.351和29.482,相同。我想指出的是,这个操作是为了计算向量轨迹上的四分之一点。当它是初始元素时,最后一个元素的最终位置是什么元素?在第一步中,线条1和线条2分别是初始和最终,在第二步中,线条2和线条3是初始和最终,等等,就像一个循环。例如:X首字母和最终字母的前26.31和27.351;第二个27.351和29.482,相同。我想指出的是,这个操作是为了计算向量轨迹上的四分之一点。非常感谢。我是TCL的初学者,但这对我来说非常适合。在这些除法中使用
4.0
可能是最明智的,这样可以确保即使输入数据看起来像整数,也使用浮点除法。非常感谢。我是TCL的初学者,但这对我来说非常适合。在这些除法中使用
4.0
可能是最明智的,这样可以确保即使输入数据看起来像整数也使用浮点除法。非常感谢您的回复亲爱的Glenn。这对我来说也很有效,但我不太理解mathfunc。正如我提到的,我从TCL语言开始。再次感谢您的回复。回过头来看,这有点过分了。尽管如此:
::tcl::mathfunc
命名空间是
expr
命令识别的函数所在的位置。请注意,我创建了一个名为
tcl::mathfunc::f
的程序,然后我可以在
expr
命令中使用
f($x,$y)
。由于您刚刚开始学习tcl,我强烈建议您使用感谢您的回复亲爱的Glenn。这对我来说也很有效,但我不太理解mathfunc。正如我提到的,我从TCL语言开始。再次感谢您的回复。回过头来看,这有点过分了。尽管如此:
::tcl::mathfunc
命名空间是
expr
命令识别的函数所在的位置。注意