用焦点和偏心率在 R 中绘制椭圆

Draw ellpses in R with foci and eccentricity

我有 n 个带焦点和偏心率的椭圆。 坐标为复数格式

<table>
<thead>
<tr>
<th>focus1</th>
<th>focus2</th>
<th>eccentricity</th>
</tr>
</thead>
<tbody>
<tr>
<td>0.04058774642776+0.492230980361489i</td>
<td>0.023005747265301+0.513567552038155i</td>
<td>0.979999999908804+0i</td>
</tr>
<tr>
<td>0.042509209111742+0.484534970821593i</td>
<td>0.02218800715139+0.527050799457565i</td>
<td>0.979999998540944+0i</td>
</tr>
</tbody>
</table> 

等等。

如何在 R 中绘制这些椭圆?

编辑: 我的初始代码是:

library(ggforce)
n = 2500
k <- 0
ellipses<- data.frame(focus1 = numeric(n), focus2 = numeric(n), ecc = numeric(n))
while ( k <= n) {
  F1_k <- ( -3/2)*((sin(2*pi*k/n))^3) + (3/10)*((sin(2*pi*k/n))^7) + (1i) * sin((2*pi*k/1875) + (pi/6)) + (1/4)*(sin((2*pi*k /1875) + (pi/6)))^3 + ((2/15) - (1/8)*cos(pi*k/625)* exp(68*pi*(1i)*k/n))
   F2_k <- ( -3/2)*((sin(2*pi*k/n))^3) + (3/10)*((sin(2*pi*k/n))^7) + (1i) * sin((2*pi*k/1875) + (pi/6)) + (1/4)*(sin((2*pi*k /1875) + (pi/6)))^3 - ((2/15) - (1/8)*cos(pi*k/625)* exp(68*pi*(1i)*k/n))
  D_k <- (49/50) - (1/7)*(sin(4*pi*k/n))^4
  ellipses[k, ] <- c(F1_k, F2_k,  D_k)
  k <- k + 1
}

我是 R 的新手,所以我知道我的代码可能效率低下。

可以做到。但首先,让我们准备一个函数,该函数将根据参数 F1、F2 和 e(焦距和偏心率)在复平面上生成一个椭圆。

fEllipse = function(F1, F2, e, n=100){
  F0 = (F1+F2)/2
  c = Mod(F2-F1)/2
  a = c/Mod(e)
  b = sqrt(a^2 - c^2)
  gamma = Arg(F2-F1)
  t = seq(0, 2*pi, length.out = n)
  F0+((a+b)/2)*exp(1i*(t+gamma))+((a-b)/2)*exp(-1i*(t-gamma))
}

让我们看看它是否有效!

fEllipse(0 + 5i, 5 + 0i, 0.95 + 0i, 10)
# [1]  5.131579-0.131579i  5.044092+1.012279i  3.766196+2.852258i  1.895832+4.527411i  0.308166+5.253917i
# [6] -0.253917+4.691834i  0.472589+3.104168i  2.147742+1.233804i  3.987721-0.044092i  5.131579-0.131579i

太棒了。现在让我们尝试绘制它

tibble(Ellipse = fEllipse(0 + 5i, 5 + 0i, 0.95 + 0i)) %>% 
  ggplot(aes(Re(Ellipse), Im(Ellipse)))+
  geom_path()

太棒了。现在让我们更进一步。让我们用十个随机椭圆做一个“tibble”,然后把它们画在图表上。

set.seed(1234)
nEllipses = 10
df = tibble(
  id = paste("Ellipse", 1:nEllipses) %>% fct_inorder(),
  F1 = runif(nEllipses, -10, 10) + runif(nEllipses, -10, 10)*1i,
  F2 = runif(nEllipses, -10, 10) + runif(nEllipses, -10, 10)*1i,
  e = runif(nEllipses, 0.7, 0.999) + 0i
) %>% group_by(id) %>% 
  nest() %>% 
  mutate(Ellipse = map(id, ~fEllipse(data[[1]]$F1, data[[1]]$F2, data[[1]]$e))) %>% 
  unnest(c(data, Ellipse))

df %>% ggplot(aes(Re(Ellipse), Im(Ellipse), color=id))+
  geom_path()

宾果游戏。这就是我们的意思!你现在需要做的就是将你的椭圆加载到 tibble 中并像我上面那样绘制它。

更新 1

如果我正确理解你的意图,你想要生成一系列省略号。的确,你用一种非常复杂和难以辨认的方式来做,但就这样吧。

n = 100
k <- 0
ellipses<- data.frame(focus1 = numeric(n), focus2 = numeric(n), ecc = numeric(n))
while ( k <= n) {
  F1_k <- ( -3/2)*((sin(2*pi*k/n))^3) + (3/10)*((sin(2*pi*k/n))^7) + (1i) * sin((2*pi*k/1875) + (pi/6)) + (1/4)*(sin((2*pi*k /1875) + (pi/6)))^3 + ((2/15) - (1/8)*cos(pi*k/625)* exp(68*pi*(1i)*k/n))
  F2_k <- ( -3/2)*((sin(2*pi*k/n))^3) + (3/10)*((sin(2*pi*k/n))^7) + (1i) * sin((2*pi*k/1875) + (pi/6)) + (1/4)*(sin((2*pi*k /1875) + (pi/6)))^3 - ((2/15) - (1/8)*cos(pi*k/625)* exp(68*pi*(1i)*k/n))
  D_k <- (49/50) - (1/7)*(sin(4*pi*k/n))^4
  ellipses[k, ] <- c(F1_k, F2_k,  D_k)
  k <- k + 1
}

df = ellipses %>% as_tibble() %>% 
  mutate(id = paste("ell",1:nrow(.))) %>% 
  group_by(id) %>%
  nest() %>%
  mutate(Ellipse = map(id, ~fEllipse(data[[1]]$focus1, data[[1]]$focus2, data[[1]]$ecc))) %>%
  unnest(c(data, Ellipse))

df %>% ggplot(aes(Re(Ellipse), Im(Ellipse), color=id))+
  geom_path()+
  theme(legend.position = "none")

100 多个椭圆是用你的代码生成的,用我的代码画的。我希望就是这样。