2013-12-01 5 views
2

Пусть x1 и y1 - векторы равной длины, определяющие координаты вершин многоугольника1.
Пусть x2 и y2 - векторы равной длины, определяющие координаты вершин многоугольника2.Пересечение участка двух заполненных многоугольников в R

Polygon1, например, могут быть нарисованы polygon(x1,y1,border=NA,col=rgb(0,0,0))

Что является самым простым способом (предпочтительно в базовой R т.е. без каких-либо пакетов), чтобы заполнить только область, которая принадлежит к обоим polygon1 и polygon2? Другими словами, какой самый простой способ рисовать (заполнять) полигон1, обрезанный полигоном 2?

фон:

Я использую это тень контурную (разноцветная) площадь под стандартным сюжетом. Каждая область между контурами должна пересекаться с областью под участком.

Некоторые ограничения на полигонах в моем случае:

В случае, если это имеет значение, polygon1 в моем случае Определяемые как область между осью х и некоторого у = f1 (х), в то время многоугольника 2 определяется как область, заключенная между y = a * f2 (x) и y = b * f2 (x), где a> b.

Simplistic пример данных:

x1 <- 0:6 
y1 <- c(0,1,2,1,0,-1,0) 
x2 <- c(x1,rev(x1)) 
y2 <- c(x1*rev(x1)/5,x1*rev(x1)/10) 
+1

Просьба воспроизводимый пример. –

+0

Включает ли добавленные примеры данных то, что вы просите? – Museful

+0

Да, пример облегчит тестирование разных подходов. –

ответ

0

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

xlim <- c(min(x1,x2),max(x1,x2)) 
ylim <- c(min(y1,y2),max(y1,y2)) 
xlim <- xlim+c(-1,1)*(xlim[2]-xlim[1])*0.04 # extend by 4% on each side 
ylim <- ylim+c(-1,1)*(ylim[2]-ylim[1])*0.04 # extend by 4% on each side 
n1 <- length(x1) 
n2 <- length(x2) 
xS <- c(xlim[1],xlim,rev(xlim),xlim[1]) 
yS <- c(0,rep(ylim,each=2),0) 
plot(NA,xlim=xlim,ylim=ylim,xaxs='i',yaxs='i') 
polygon(xS,yS,border=NA,col=rgb(0,0,0)) 
polygon(c(x1,xS),c(y1,yS),border=NA,col=rgb(1,1,1)) 
polygon(c(x2,xS),c(y2,yS),border=NA,col=rgb(1,1,1)) 
box() 
polygon(x1,y1) 
polygon(x2,y2) 

plotted intersection of polygon 1 and polygon 2

Так что для меня этот ответ не режет его. Но, возможно, это могло бы посадить какое-то семя идеи кому-то еще, как это сделать.

1

Поскольку вы не задаете четко определенной функции в вашем примере, невозможно определить область пересечения математически. Вы shoudl определяете регион manulaly один за другим.

Другой вариант, вы можете играть с альфа-смешиванием, чтобы различать регионы.

xA <- 0:6 
yA <- c(0,1,2,1,0,-1,0) 
xB <- c(x1,rev(x1)) 
yB <- c(x1*rev(x1)/5,x1*rev(x1)/10) 
plot(NA,xlim=extendrange(c(xA,xB)), 
      ylim=extendrange(c(yA,yB)),xaxs='i',yaxs='i',frame.plot=F) 
polygon(x = c(xA,tail(xA,1)), y = c(yA,0),col=rgb(1,0,1,0.5),border="white") 
polygon(x = c(xB,tail(xB,1)), y = c(yB,0),col=rgb(1,0,1,0.5),border='white') 

enter image description here

+0

Спасибо, это может быть полезно в некоторых ситуациях, но, к сожалению, в моем случае мне действительно нужно затенять только пересечение и ничего больше. – Museful