Как сгенерировать список сегментов из списка случайных самоперехватывающихся строк (psp в R)?

Я использую X=rpoisline(4) для создания линий и построения их с помощью plot(X). С X$ends у меня есть их координаты и их точки пересечения с selfcrossing.psp(X) (в R со спатстатом: library(spatstat)).

Мне нужно получить список сегментов и их координат и иметь возможность манипулировать ими (изменить их ориентацию, положение, пересечение...). Эти сегменты должны быть определены пересечением одной линии с другой линией и с окном.

Итак, мне не хватает простого способа преобразовать psp из нескольких пересекающихся строк в psp непересекающихся сегментов (надеюсь, понятно)?

Если у вас есть не простой способ, мне интересно!

Спасибо за ваше время !

редактировать :

Вот строки, которые у меня есть:

вот что у меня есть

И вот какие случайные вещи, я думаю, я могу создать, если мне удастся обработать каждый сегмент (один за другим). Поэтому мне нужно получить список сегментов из моего списка случайных строк.

и вот что мне нужно


person Yo B.    schedule 16.01.2013    source источник
comment
Можете ли вы привести пример, то есть некоторые команды, которые генерируют вывод, который у вас есть? Это дало бы людям возможность поэкспериментировать и, таким образом, увеличило бы шансы на полезный ответ.   -  person MvG    schedule 16.01.2013
comment
Итак, проблема в том, что у вас есть куча упорядоченных пар, представляющих точки пересечения, но эти данные не сопоставлены (например, по их положению в массиве данных) с данными, определяющими линии, которые участвуют в указанных пересечениях?   -  person Carl Witthoft    schedule 16.01.2013
comment
Вот что я набираю в библиотеку R (spatstat) lignes=rpoisline(4) plot(lignes) lignes$ends interP=selfcrossing.psp(lignes) plot(interP,add=T,col=red) @CarlWitthoft: это моя проблема !   -  person Yo B.    schedule 17.01.2013
comment
Извините, мне не удалось отформатировать этот комментарий...   -  person Yo B.    schedule 17.01.2013
comment
Пожалуйста, опубликуйте сюжет, который вы создаете, И эскиз сюжета, который вы хотели бы создать. Боюсь, что языковой барьер сбивает с толку.   -  person Carl Witthoft    schedule 17.01.2013
comment
Глядя на ваше второе изображение, я думаю, что вам НЕ следует начинать с первого изображения (или строк за ним). Больше похоже на: нарисуйте одну любую линию, затем выберите случайную точку либо на границе изображения (рамке), либо на линии, и нарисуйте случайный сегмент из этой точки, пока вы не пересечете существующую линию или границу. Повторяйте так часто, как хотите.   -  person Carl Witthoft    schedule 17.01.2013


Ответы (2)


Функция spatstat selfcut.psp предназначена именно для этой цели.

Y <- selfcut.psp(X)

Дополнительную информацию об управлении шаблонами сегментов линий см. в разделе 4.4 книги по статистической информации.

person Adrian Baddeley    schedule 27.06.2016
comment
О, отлично — предоставьте хорошее, чистое, простое решение через 3 года и украдите мои баллы. :-) . Нет, серьезно, я рад, что вы опубликовали это, а не мой код кладжа. - person Carl Witthoft; 27.06.2016

Хорошо, несколько перерывов на кофе позже, вот немного кода с ошибками, который делает то, что вы хотите. Уборку я оставлю тебе.

ranpoly <- function(numsegs=10,plotit=TRUE) {

require(spatstat)
# temp fix: put the first seg into segset. Later make it a constrained random.
segset<-psp(c(0,1,1,0,.25),c(0,0,1,1,0),c(1,1,0,0,1),c(0,1,1,0,.75),owin(c(0,1),c(0,1)) ) #frame the frame
for (jj in 1: numsegs) {
    # randomly select a segment to start from, a point on the seg, the slope,and direction
    # later... watch for slopes that immediately exit the frame
    endx <-sample(c(-0.2,1.2),1)  #force 'x1' outside the frame
# watch that sample() gotcha
    if(segset$n<=5) sampset <- c(5,5) else sampset<-5:segset$n
    startseg<-sample(sampset,1) #don't select a frame segment
    # this is slope of segment to be constructed
    slope <- tan(runif(1)*2*pi-pi) # range +/- Inf 
    # get length of selected segment
    seglen<-lengths.psp(segset)[startseg]
    startcut <- runif(1) 
    # grab the coords of starting point (similar triangles)
    startx<- segset$ends$x0[startseg] + (segset$ends$x1[startseg]-segset$ends$x0[startseg])*startcut #seglen
    starty<- segset$ends$y0[startseg] + (segset$ends$y1[startseg]-segset$ends$y0[startseg])*startcut #seglen
    # make a psp object with that startpoint and slope; will adjust it after finding intersections
    endy <- starty + slope*(endx-startx)
    newpsp<-psp(startx,starty,endx,endy,segset$window,check=FALSE)
    # don't calc crossing for current element of segset
    hits <- crossing.psp(segset[-startseg],newpsp)
    segdist <- dist(cbind(c(startx,hits$x),c(starty,hits$y)))
    # dig back to get the crosspoint desired -- have to get matrixlike object out of class "dist" object
    # And, as.matrix puts a zero in location 1,1 kill that row.
    cutx <- hits$x[ which.min( as.matrix(segdist)[-1,1] )]
    cuty <- hits$y[which.min(as.matrix(segdist)[-1,1] )]
    segset <- superimpose(segset,psp(startx,starty,cutx,cuty,segset$window))

} #end jj loop
if(plotit) plot(segset,col=rainbow(numsegs))
return(invisible(segset))
}
person Carl Witthoft    schedule 18.01.2013
comment
Это круто ! Я постараюсь разобраться с этим для своей темы и, возможно, вернусь к вам с проблемами! ^^ Большое спасибо за ваше время! - person Yo B.; 24.01.2013