在R或Matlab中绘制一个像这样着色的多边形

在R或Matlab中绘制一个像这样着色的多边形,r,matlab,plot,graphics,polygons,R,Matlab,Plot,Graphics,Polygons,我的示例代码如下所示,我不知道如何使用色调颜色着色 plot.koch <- function(k,col="blue"){ plot(0,0,xlim=c(0,1), ylim=c(-sqrt(3)/6,sqrt(3)/2), asp = 1,type="n",xlab="", ylab="") plotkoch <- function(x1,y1,x2,y2,n){ if (n > 1){ plotkoch(x1,y1,(2*x1+x2)/3,

我的示例代码如下所示,我不知道如何使用色调颜色着色

plot.koch <- function(k,col="blue"){ 
  plot(0,0,xlim=c(0,1), ylim=c(-sqrt(3)/6,sqrt(3)/2), asp = 1,type="n",xlab="", ylab="")
  plotkoch <- function(x1,y1,x2,y2,n){
    if (n > 1){
      plotkoch(x1,y1,(2*x1+x2)/3,(2*y1+y2)/3,n-1); 
      plotkoch((2*x1+x2)/3,(2*y1+y2)/3,(x1+x2)/2-(y1-y2)*sqrt(3)/6,(y1+y2)/2-(x2-x1) *sqrt(3)/6,n-1);
      plotkoch((x1+x2)/2-(y1-y2)*sqrt(3)/6,(y1+y2)/2-(x2-x1)*sqrt(3)/6,(2*x2+x1)/3,(2 *y2+y1)/3,n-1); 
      plotkoch((2*x2+x1)/3,(2*y2+y1)/3,x2,y2,n-1)
    }    
    else { 
      x=c(x1,(2*x1+x2)/3,(x1+x2)/2-(y1-y2)*sqrt(3)/6,(2*x2+x1)/3,x2); 
      y=c(y1,(2*y1+y2)/3,(y1+y2)/2-(x2-x1)*sqrt(3)/6,(2*y2+y1)/3,y2); 
      polygon(x,y,type="l",col=col) 
    }
  }
  plotkoch(0,0,1,0,k) 
  plotkoch(0.5,sqrt(3)/2,0,0,k) 
  plotkoch(1,0,0.5,sqrt(3)/2,k)
}
  plot.koch(3, col=3)  

plot.koch我会这样做:

  • 对于任何绘制像素,获取其位置
    x,y
  • 计算
    角度=atan2(y-y0,x-x0)

    其中
    x0,y0
    是科赫的雪花中间位置

  • 根据角度计算颜色

    如果您使用HSV,则
    hue=angle
    并计算目标颜色值(我假设RGB)。如果您想要可见光谱颜色,可以试试我的:

    只需将角度范围
    angle=[rad]
    转换为波长
    l=[nm]

    l = 400.0 + (700.0-400.0)*angle/(2.0*M_PI)
    
  • 渲染像素

  • [Notes]

    不使用RMatlab,因此需要自己编写代码。角度可能需要一些移动来匹配坐标系,例如:

    const angle0=???; // some shift constant [rad]
    angle+=angle0; // or angle=angle0-angle; if the direction is oposite
    if (angle>=2.0*M_PI) angle-=2.0*M_PI;
    if (angle<      0.0) angle+=2.0*M_PI;
    
    const angle0=???;//某些移位常数[rad]
    角度+=角度0;//或角度=角度0角度;如果方向是oposite
    如果(角度>=2.0*M_-PI)角度-=2.0*M_-PI;
    如果(角度<0.0)角度+=2.0*M_π;
    
    如果将其绘制为多边形,则需要计算每个顶点的颜色,而不是每个像素的颜色,但这样会出现问题,因为这不是凸多边形。那么如何保证中点颜色???我担心你将需要使用一些三角测量,因为简单的三角形风扇将失败


    唯一显而易见的是填充整个空间的颜色,然后用黑色绘制轮廓,然后用白色从外部泛光填充所有非黑色像素。目前,它还绘制雪花外部的颜色。如果您能够确定点是在雪花内部还是外部,那么您应该能够在
    df_fill
    中删除外部点。 这里我首先创建用于绘制多边形的
    data.frame
    。然后我为背景色创建
    data.frame
    。最后,我使用
    ggplot2
    来绘制数据

    # creating relevant data
    data.koch <- function(k){ 
      df <- data.frame(x = 0, 
                       y = 0, 
                       grp = 0)
      plotkoch <- function(x1, y1, x2, y2, n, data){
        if (n==1) {
          x=c(x1,(2*x1+x2)/3,(x1+x2)/2-(y1-y2)*sqrt(3)/6,(2*x2+x1)/3,x2) 
          y=c(y1,(2*y1+y2)/3,(y1+y2)/2-(x2-x1)*sqrt(3)/6,(2*y2+y1)/3,y2) 
          df <- rbind(data, data.frame(x, y, grp=max(data$grp)+1))
        }
        if (n > 1){
          df <- plotkoch(x1,y1,(2*x1+x2)/3,(2*y1+y2)/3,n-1, data = data)
          df <- plotkoch((2*x1+x2)/3,(2*y1+y2)/3,(x1+x2)/2-(y1-y2)*sqrt(3)/6,(y1+y2)/2-(x2-x1) *sqrt(3)/6,n-1, data=df)
          df <- plotkoch((x1+x2)/2-(y1-y2)*sqrt(3)/6,(y1+y2)/2-(x2-x1)*sqrt(3)/6,(2*x2+x1)/3,(2 *y2+y1)/3,n-1, data=df) 
          df <- plotkoch((2*x2+x1)/3,(2*y2+y1)/3,x2,y2,n-1, data=df)
        }    
        return(df)
      }
      df <- plotkoch(0,0,1,0,k, data = df) 
      df <- plotkoch(0.5,sqrt(3)/2,0,0,k, data = df) 
      df <- plotkoch(1,0,0.5,sqrt(3)/2,k, data = df)
      return(df)
    }
    # plotting functon
    plot.koch <- function(k){
      stopifnot(require(ggplot2))
      if (is.data.frame(k)) df <- k
      else df <- data.koch(k)
      # filling data (CHANGE HERE TO GET ONLY INSIDE POINTS)
      l <- 500
      df_fill <- expand.grid(x=seq(0, 1, length=l), 
                             y=seq(-sqrt(3)/6, sqrt(3)/2, length=l))
      df_fill[, "z"] <- atan2(-df_fill[, "y"] + sqrt(3)/6, df_fill[, "x"] - 0.5) + pi/2
      df_fill[df_fill[, "z"] < 0, "z"] <- df_fill[df_fill[, "z"] < 0, "z"] + 2*pi
      # plotting
      ggplot(df, aes(x, y, group=grp)) + 
        geom_raster(data = df_fill, 
                    aes(fill=z, group=NULL), 
                    hjust = 0,
                    vjust = 0,
                    linetype='blank') + 
        geom_path(data=df, size=1) +
        scale_fill_gradientn(colours = rainbow(30), guide = 'none') + 
        scale_x_continuous(name = '', limits = c(0, 1), expand=c(0, 0)) + 
        scale_y_continuous(name = '', limits = c(-sqrt(3)/6,sqrt(3)/2), expand=c(0, 0)) +
        coord_fixed() +
        theme_bw() +
        theme(axis.line = element_blank(), 
              panel.grid = element_blank(), 
              axis.ticks = element_blank(), 
              axis.text = element_blank())
    }
    #
    p <- plot.koch(4)
    print(p)
    
    #创建相关数据
    
    data.koch这里有一种方法使用R中的空间对象,混合使用
    sp
    rgeos
    光栅

  • 对函数进行轻微修改,以将
    x
    y
    坐标返回给用户(并按正确顺序):

  • 加载空间包,从fractal创建
    空间多边形
    对象,并绘制一次以设置绘图区域

    library(sp)
    library(rgeos)
    library(raster)
    
    poly <- SpatialPolygons(list(Polygons(list(Polygon(xy)), 1)))
    plot(poly)
    
  • 再次绘制多边形

    plot(poly, add=TRUE)
    

  • 这是我的网格解决方案

    ##data
      koch <- function(k) {
            yy <- xx <- numeric(0)
            Koch <- function(x1, y1, x2, y2, n) {
                if (n > 1) {
                    Koch(x1, y1, (2 * x1 + x2)/3, (2 * y1 + y2)/3, n - 1)
                    Koch((2 * x1 + x2)/3, (2 * y1 + y2)/3, (x1 + x2)/2 - (y1 - 
                      y2) * sqrt(3)/6, (y1 + y2)/2 - (x2 - x1) * sqrt(3)/6, 
                      n - 1)
                    Koch((x1 + x2)/2 - (y1 - y2) * sqrt(3)/6, (y1 + y2)/2 - 
                      (x2 - x1) * sqrt(3)/6, (2 * x2 + x1)/3, (2 * y2 + y1)/3, 
                      n - 1)
                    Koch((2 * x2 + x1)/3, (2 * y2 + y1)/3, x2, y2, n - 1)
                } else {
                    x <- c(x1, (2 * x1 + x2)/3, (x1 + x2)/2 - (y1 - y2) * sqrt(3)/6, 
                      (2 * x2 + x1)/3, x2)
                    xx <<- c(xx, x)
                    y <- c(y1, (2 * y1 + y2)/3, (y1 + y2)/2 - (x2 - x1) * sqrt(3)/6, 
                      (2 * y2 + y1)/3, y2)
                    yy <<- c(yy, y)
                }
            }
            Koch(0, 0, 1, 0, k)
            Koch(1, 0, 0.5, sqrt(3)/2, k)
            Koch(0.5, sqrt(3)/2, 0, 0, k)
            xy <- data.frame(x = (xx - min(xx))/(max(xx) - min(xx)), y = (yy - 
                min(yy))/(max(yy) - min(yy)))
            rbind(unique(xy), xy[1, ])
        }
    xy <- koch(5)
    ##Plot
    library(grid)
    grid.newpage()
    pushViewport(dataViewport(xy$x, xy$y), plotViewport(c(1, 1, 1, 1)))
        for (i in 1:nrow(xy)) {
           grid.path(x = c(xy[i, 1], xy[i + 1, 1], mean(xy$x)), 
                     y = c(xy[i, 2], xy[i + 1, 2], mean(xy$y)), 
                     gp = gpar(col = rainbow(nrow(xy))[i], 
                               fill = rainbow(nrow(xy))[i]))
            }
    
    ##数据
    科赫
    
    library(sp)
    library(rgeos)
    library(raster)
    
    poly <- SpatialPolygons(list(Polygons(list(Polygon(xy)), 1)))
    plot(poly)
    
    r <- 1
    mapply(function(theta, col) {
      segments(0.5, 0.3, 0.5 + r*cos(theta), 0.3 + r*sin(theta), lwd=3, col=col) 
    }, seq(0, 360, length=1000)*pi/180, colr(1000))       
    
    plot(gDifference(as(extent(par('usr')), 'SpatialPolygons'), poly), 
         col='white', border='white', add=TRUE)
    
    plot(poly, add=TRUE)
    
    ##data
      koch <- function(k) {
            yy <- xx <- numeric(0)
            Koch <- function(x1, y1, x2, y2, n) {
                if (n > 1) {
                    Koch(x1, y1, (2 * x1 + x2)/3, (2 * y1 + y2)/3, n - 1)
                    Koch((2 * x1 + x2)/3, (2 * y1 + y2)/3, (x1 + x2)/2 - (y1 - 
                      y2) * sqrt(3)/6, (y1 + y2)/2 - (x2 - x1) * sqrt(3)/6, 
                      n - 1)
                    Koch((x1 + x2)/2 - (y1 - y2) * sqrt(3)/6, (y1 + y2)/2 - 
                      (x2 - x1) * sqrt(3)/6, (2 * x2 + x1)/3, (2 * y2 + y1)/3, 
                      n - 1)
                    Koch((2 * x2 + x1)/3, (2 * y2 + y1)/3, x2, y2, n - 1)
                } else {
                    x <- c(x1, (2 * x1 + x2)/3, (x1 + x2)/2 - (y1 - y2) * sqrt(3)/6, 
                      (2 * x2 + x1)/3, x2)
                    xx <<- c(xx, x)
                    y <- c(y1, (2 * y1 + y2)/3, (y1 + y2)/2 - (x2 - x1) * sqrt(3)/6, 
                      (2 * y2 + y1)/3, y2)
                    yy <<- c(yy, y)
                }
            }
            Koch(0, 0, 1, 0, k)
            Koch(1, 0, 0.5, sqrt(3)/2, k)
            Koch(0.5, sqrt(3)/2, 0, 0, k)
            xy <- data.frame(x = (xx - min(xx))/(max(xx) - min(xx)), y = (yy - 
                min(yy))/(max(yy) - min(yy)))
            rbind(unique(xy), xy[1, ])
        }
    xy <- koch(5)
    ##Plot
    library(grid)
    grid.newpage()
    pushViewport(dataViewport(xy$x, xy$y), plotViewport(c(1, 1, 1, 1)))
        for (i in 1:nrow(xy)) {
           grid.path(x = c(xy[i, 1], xy[i + 1, 1], mean(xy$x)), 
                     y = c(xy[i, 2], xy[i + 1, 2], mean(xy$y)), 
                     gp = gpar(col = rainbow(nrow(xy))[i], 
                               fill = rainbow(nrow(xy))[i]))
            }