给指定区域上色?

4

我正在尝试找出如何仅对使用grid.circle创建的圆的一半进行着色的方法。

    library(grid)
    grid.circle(x=.5, y=.5, r=.25,gp=gpar(lwd=10))

我想让上半部分变成蓝色,下半部分保持白色。

感谢您的帮助!


你在用什么编程语言工作? - alestanis
请参见https://dev59.com/omnWa4cB1Zd3GeqPzlzF#12800110。 - Drew Steen
2个回答

5
使用grid.polygon()和一些基本的三角学知识,您可以定义一个函数来实现这个功能。
需要注意的是,在视口不是正方形时,必须小心处理填充的半圆不会被扭曲。为了以与grid.circle()使用的规则相匹配的方式实现这一点,我将原点设置为"npc"单位,并将圆的半径设置为"snpc"单位。(有关"npc""snpc"的含义,请参见?unitvignette("grid")):
library(grid)

filledSemiCircle <- function(x_origin, y_origin, radius, fillcolor, top=TRUE) {
    theta <- seq(0, pi, length = 100)
    if(!top) theta <- theta + pi     ## To fill the bottom instead
    x <- unit(x_origin, "npc") + unit(cos(theta) * radius, "snpc")
    y <- unit(y_origin, "npc") + unit(sin(theta) * radius, "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledSemiCircle(0.5, 0.5, 0.25, "dodgerblue")
filledSemiCircle(0.5, 0.5, 0.25, "gold", top=FALSE)
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here


干得好。这个绘制填充弦。进行一些简单的修改,就可以得到代码,实现了一个在Rhelp上已经空缺了约5年的项目,即如何构建“与指定中心和半径内的圆对齐”或“适合于圆内”的弧线。http://markmail.org/search/?q=list%3Aorg.r-project.r-help+grid.curve+arc#query:list%3Aorg.r-project.r-help%20grid.curve%20arc+page:1+mid:7euwzo4gppfxnobx+state:results - IRTFM
@DWin -- 太棒了。我必须说,我对自己的这个项目感到非常自豪。此外,我对Paul Murrel卓越的软件工艺的尊重也在不断增长。 - Josh O'Brien

2

这是对Josh出色工作的第一次修改草稿,用于创建填充和弦:

filledArc <- function(x_origin, y_origin, radius, fillcolor, top=TRUE) {
    theta <- seq(0, pi/2, length = 100)
    if(!top) theta <- theta + pi     ## To fill the bottom instead
    x <- unit(x_origin, "npc") + unit(c(0, cos(theta) * radius, 0), "snpc")
    y <- unit(y_origin, "npc") + unit(c(0, sin(theta) * radius, 0), "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledArc(0.5, 0.5, 0.25, "lightgoldenrod")
filledArc(0.5, 0.5, 0.25, "blue", top=FALSE)
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here

我认为还需要进一步的工作,使其可以通过起始和结束角度进行参数化(已完成):

filledArc2 <- function(x_origin, y_origin, radius, fillcolor, angle0, angle1) {
    theta.range <- seq(angle0, angle1, length = 100)
    x <- unit(x_origin, "npc") + unit(c(0, cos(theta.range) * radius, 0), "snpc")
    y <- unit(y_origin, "npc") + unit(c(0, sin(theta.range) * radius, 0), "snpc")
    grid.polygon(x, y, gp = gpar(fill = fillcolor))
}

filledArc2(0.5, 0.5, 0.25, "lightgoldenrod", 0,      pi/4)
filledArc2(0.5, 0.5, 0.25, "blue",           pi/4,   pi*(3/2) )
grid.circle(x = .5, y=.5, r=.25,gp=gpar(lwd=10))

enter image description here


也许将其向量化会更好,这样一次调用filledArc()(或filledSemiCircle())就可以采用x和y起点的向量,在每个点上绘制相同的“符号”。 (并不是说你应该这样做 - 我肯定太懒了,无法自己完成;) - Josh O'Brien
同意。可能还应该允许gpar()函数接受更多的参数来控制边框和线条的宽度,可以使用...或其他列表传递机制或modifyList函数实现。 - IRTFM
@JoshO'Brien:我已经向保罗·穆雷尔发送了一封电子邮件,引用了您在这个问题上的工作。 - IRTFM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接