Mathematica
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]]]
I want to do the above at home where I do not have Mathematica. Use whatever tool you want, I like to use Python and R but happy with any solution candidate. The first thing that came to my mind was RStudio and this question here but I am unsure whether some better way to do this.
How can I do the interactive-GUI-innovating over X?
Procedure of the Mathematica -snippet outlined
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
Here is an R function that does what you describe:
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())
You can change the shape
argument to xspline
to change the style of spline. This version returns a 2 column matrix with the x and y values, but that could be changed to another structure if prefered. There are plenty of other things that could be customized as well.
Added function to get the output to paste into Mathematica:
matrix2mathematica <- function(x) {
paste0( '{',
paste0( '{', x[,1], ', ', x[,2], '}', collapse=', '),
'}')
}
cat( matrix2mathematica(out))
Feel free to look at / take from my dorky, buggy, RateSketch()
function in R, which does something similar here. You can pare it down to your case, plenty of room for simplification
Just a simple example of locator
:
plot(1:10)
point <- locator(1)
# now click somewhere on the plot
point
$x
[1] 8.010256
$y
[1] 7.980781
(results will of course vary depending on where you clicked)