2

数学

DynamicModule[{list = {}}, 
 EventHandler[
  Dynamic[Framed@
    Graphics[{BSplineCurve[list], Red, Line[list], Point[list]}, 
     PlotRange -> 2]], {{"MouseClicked", 
     1} :> {AppendTo[list, 
      MousePosition["Graphics"]]}}, {"MouseClicked", 2} :> 
   Print[list]]]

我想在没有 Mathematica 的家里做上述事情。使用您想要的任何工具,我喜欢使用 Python 和 R,但对任何候选解决方案都很满意。我首先想到的是 RStudio 和这个问题但我不确定是否有更好的方法来做到这一点。

如何在 X 上进行交互式 GUI 创新?

Mathematica -snippet 的过程概述

1. you click points

2. you will see BSplineCurve formating between the points and points are red

3. points are saved to an array

4. when finished, you click `right-mouse-button` so array to stdout
4

3 回答 3

5

这是一个 R 函数,可以执行您所描述的操作:

dynmodfunc <- function() {
    plot(0:1,0:1,ann=FALSE,type='n')
    mypoints <- matrix(ncol=2, nrow=0)
    while( length(p <- locator(1, type='p', col='red')) ) {
        mypoints <- rbind(mypoints, unlist(p))
        plot(mypoints, col='red', ann=FALSE, xlim=0:1, ylim=0:1)
        if(nrow(mypoints)>1) {
            xspline(mypoints, shape=-1)
        }
    }
    mypoints
}

(out <- dynmodfunc())

您可以更改shape参数以xspline更改样条线的样式。此版本返回具有 x 和 y 值的 2 列矩阵,但如果愿意,可以将其更改为另一种结构。还有很多其他的东西可以定制。

添加了将输出粘贴到 Mathematica 的功能:

matrix2mathematica <- function(x) {
    paste0( '{', 
        paste0( '{', x[,1], ', ', x[,2], '}', collapse=', '),
    '}')
}

cat( matrix2mathematica(out))
于 2012-08-22T19:15:41.600 回答
1

随意查看/借鉴我RateSketch()在 R 中的笨拙、错误的函数,它在此处执行类似的操作。你可以根据你的情况减少它,有足够的简化空间

于 2012-08-22T17:52:35.373 回答
1

只是一个简单的例子locator

plot(1:10)
point <- locator(1)
# now click somewhere on the plot

point
$x
[1] 8.010256

$y
[1] 7.980781

(结果当然会根据您单击的位置而有所不同)

于 2012-08-22T18:39:31.943 回答