使用距离公式调整坐标

时间:2018-09-19 10:11:31

标签: r function loops while-loop

我有一张图表,上面带有一些极坐标图图像,并给出了一些x和y坐标。但是,其中一些图表重叠。我需要创建一种方法来将每个图表间隔15个距离,但要最大程度地减少x和y的变化。

因此,如果一个点到另一个点的距离为13,则距我的原点(50,50)最远的点将移动2的距离,以确保点之间的新距离为15。使用距离公式表示点之间的距离。 原点是(50,50),因为那是我新图片的中心。

功能

我正在考虑使用以下方法创建check.xcheck.y函数:

  • 点之间距离的参数
  • 它们到(50,50)原点的距离(从1到k的等级,即k是距原点的另一点或实际距离)
  • 我们要移动的点的旧x_coordinate和y_coordinate
  • 我们要测试的点的x_coordinate和y_coordinate

该函数将针对测试点测试给定点。如果给定点距离原点较远,则将其移动,否则不执行任何操作。如果给定点距原点最远,并且给定点与测试点之间的距离小于15,则将给定点移动15个距离。否则,什么也不做。

下面我有一个粗略的草稿,但是在如何编写参数和返回值方面遇到了麻烦。观察:

 ## Creates new x coordinate given points
check.x<-function(x,rank1,rank2, distance,y_cor.1,x_cor.2,y_cor.2){
  origin.x=x_cor.2
  origin.y=y_cor.2
  newish.x=x-x_cor.2
  newish.y=y_cor.1-y_cor.2
  theta=atan2(newish.y,newish.x)
  if(rank1>rank2){##adjust x
    if(distance<15&distance!=0){
      new.x<-cos(theta)*15+50
    }else{}
  }else{}
  return(new.x)
}

## Creates new y coordinate given points
check_y<-function(y,rank1,rank2, distance,x_cor.1,x_cor.2,y_cor.2){
  origin.x=x_cor.2
  origin.y=y_cor.2
  newish.x=x_cor.1-x_cor.2
  newish.y=y-y_cor.2
  theta=atan2(newish.y,newish.x)
  if(rank1>rank2){##adjust x
    if(distance<15&distance!=0){
      new.y<-sin(theta)*15+50
    }else{}
  }else{}
  return(new.y)
}

循环

运行此命令时,我相信应该将其放入while loop的{​​{1}}中。但是,当我在自己的数据帧上distance<15对其进行一次操作时,可以完成一次。然后,我对join进行了计算,但是随后我需要重新检查距离,并使用新的点再次加入数据框。我该如何纠正这个问题以减少连接数并使它覆盖新的点?我已经编写了尽可能多的代码,但是无法进一步考虑下一步,但是提供了一些注释,作为我认为应该如何进行的步骤。每个check.表示一个新步骤

##

**数据**

## Coordinate DataFrame
coordf<-data.frame(df$Id,df$GroupId,df$x_coordinate,df$y_coordinate)
coordf<-coordf[!duplicated(coordf$df.Id),]
colnames(coordf)<-c('Id','Group','x_coordinate','y_coordinate')
coordf$DistOrigin<-sqrt((coordf$x_coordinate-50)^2+(coordf$y_coordinate-50)^2)
## Orders/Ranks position based on distance to origin
coordf$rank<-ave(coordf$DistOrigin,
               factor(paste(coordf$Group)),
               FUN=rank)
point_df<-coordf%>% mutate(k=1)       ## dummy column
point_df<-point_df%>%                  ## Distance between each points
  full_join(point_df,by='k')%>%
  mutate(dist=sqrt((x_coordinate.x-x_coordinate.y)^2+(y_coordinate.x-y_coordinate.y)^2))%>%
  select(-k)
## Removes the points that are the same, i.e. x1=x2 and y1=y2 and within same group
point_df<-point_df[(point_df$Group.x==point_df$Group.y),]
point_df<-point_df[(point_df$dist!=0),]
## Loop ... I have also never written a while loop before in R
## This is where I get lost due to the complexity
while (distance <15){
  ## Run check.x and check.y
  ## Take the return values and attach them in a new column
  ## Recheck the distance
  ## Re-rank the points in response to the (50,50) origin
} 

0 个答案:

没有答案