Unity3d在屏幕范围内随机生成一个圆

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity3d在屏幕范围内随机生成一个圆相关的知识,希望对你有一定的参考价值。

目前需要在屏幕内随机位置生成一个圆形,在鼠标移过去后消失(不是倒计时那种),具体怎么实现我实在是不知道该怎么弄,新人求大神帮忙!!
PS:用C#编的

参考技术A 1.一个三维数组由行、列和页三维组成,其中每一页包含一个由行和列构成的二维数组。
2.利用标准数组函数创建多维数组
A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand和randn等函数有相似的用法。
3.利用直接索引方式生成多维数组
A=zeros(2,3)
A(:,:,2)=ones(2,3)
A(:,:,3)=4
上面的代码先生成一个二维数组作为三维数组的第一页,然后通过数组直接索引,添加第二页、第三页。
4.利用函数reshape和repmat生成多维数组
B=reshape(A,2,9)
B=[A(:,:,1) A(:,:,2) A(:,:,3)] %结果与上面一样。
reshape(B,2,3,3)
reshape(B,[2 3 3]) %结果与上面一样。
提示:reshape函数可以将任何维数的数组转变成其他维数的数组。
5.利用repmat函数生成多维数组
C=ones(2,3)
repmat(C,[1 1 3]) % repmat写出类似reshape的repmat(C,1,1,3)将显示出错
提示:repmat是通过数组复制创建多维数组的,上面的代码即是将数组C在行维和列维分别复制一次,然后再页维复制三次得到2×3×3的三维数组。
6.利用cat函数创建多维数组
a=zeros(2);
b=ones(2);
c=repmat(2,2,2);
D=cat(3,a,b,c)%创建三维数组
D=cat(4,a,b,c) %创建4维数组。
D(:,1,:,:) %查看第一列的数据。
size(D) %可以知道数组D的具体维数。
6.数组运算与处理
数组之间的运算要求两个数组在任何一维都必须具有相同的大小。
(1)squeeze函数用于删除多维数组中的单一维(即大小为1的那些维)
E=squeeze(D)
size(D) E的数据和D一样,但比D少了一维,只有2行、2列和3页。
(2)reshape函数可以将一个三维向量变成一维向量。
v(1,1,:)=1:6
squeeze(v)
v(:)
(3)reshape函数用于改变多维数组的行、列、页以及更高阶的维数,但不改变数组元素的总个数。
F=cat(3,2+zeros(2,4),ones(2,4),zeros(2,4))
G=reshape(F,[3,2,4])
H=reshape(F,[4 3 2]) 或K=reshape(F,2,12)
多维数组的重组按这样的顺序:第一页的第一列、第二列……,第二页的第一列、第二列……。
7.sub2ind函数和ind2sub函数用于多维数组的直接引用,索引顺序与重组顺序一致。
sub2ind(size(F),1,1,1) %求第1行、第1列、第1页的数值的单一索引
sub2ind(size(F),1,2,1) %求第1行、第2列、第1页的数值的单一索引
sub2ind(size(F),1,2,3) %求第1行、第2列、第3页的数值的单一索引

[r c p]=ind2sub(size(F),19) %由单一索引求其对应的行列页数值。
8.函数flipdim用于多维数组的翻转,相当于二维数组中的flipud和fliplr函数。例如下面的代码进行按行、列和按页翻转。
M=reshape(1:18,2,3,3)
flipdim(M,1) %每一页中的行翻转
flipdim(M,2) %每一页中的列翻转
flipdim(M,3) %将第一和第三页翻转调换
9.函数shiftdim用于循环轮换一个数组的维数。如果一个数组r行、c列和p页,则循环轮换一次,就生成一个c行、p列和r页的数组。
M %重新调用
shiftdim(M,1) %轮换一次
shiftdim(M,2) %轮换两次
数组轮换后规律很难直观理解,我们可以将三维数组看成一个类似魔方的方形盒子
函数shiftdim也支持负的循环轮换次数。执行该轮换时,数组的维数增加,并且多出的维数均为单一维。
M %重新调用
size(M)
shiftdim(M,-1)
size(ans).
10.函数permute和ipermute用于实现多维条件下的转置操作。从本质上讲permute函数是shiftdimhas函数的扩展。
M %重新调用
permute(M,[2 3 1])
shiftdim(M,1) %两者结果一样
permute函数中的参数[2 3 1]表示使函数第二维成为第一维,第三维成为第二维,第一维成为第三维。
11. permute(M,[2 1 3])
[2 1 3]表示将数组的行列相互转置,页保持不变(只在第一和第二维转置)。
permute函数的第一个参数为待转置的数组,第二个参数为转置顺序,它必须是待转置的多维数组的维数的某种排列,否则所进行的转置无法进行。
permute函数也可以用来将一个数组变成更高维的数组,例如shiftdim(M,-1)也可以用permute函数来实现。
permute(M,[4 1 2 3])
这是 因为任何一个数组都具有大于其本身尺寸的更高维数,并且这些维数均为单一维数。例如二维数组具有页这一维,只是只有一页。总之超过数组本身大小的维数都是单一维。M是一个三维数组,其第四维必为单一维,因此将M的第四维与第一维转置,第一维变成了单一维。
12.二维数组两次转置变换回原来的形式,对于多维数组,用函数ipermute来取消permute所执行的转置操作。
M %重新调用
permute(M,[3 2 1])
ipermute(M,[3 2 1]) %在我的Matlab上运行没有达到预期效果
13.size函数返回数组每一维的大小
numel函数返回数组的总元素个数
当不指定size的返回值时,将返回一个由数组的各维数组成的向量。当我们知道数组的维数时,可以将维数返回到指定变量中。
[r c p]=size(M)
r=size(M,1)
c=size(M,2)
p=size(M,3)
v=size(M,4)
当一个数组的维数或者某数组维数不确定时,可以利用函数ndims获得数组的维数值。例如:ndims(M),与length(size(M))等效。

生成随机坐标,存储在圆半径内

【中文标题】生成随机坐标,存储在圆半径内【英文标题】:Generate random coordinates, store within circle radius 【发布时间】:2018-11-06 14:55:06 【问题描述】:

我有一个公式可以生成需要在网格上显示的数字。所有点都应该从原点开始扩展到所有边。

这些应该随机扩展到各个方面,但是,因为公式随着时间的推移而变化,所以要显示的点越来越多。

假设我们有 100 分,我们已经将它们设置在网格上,公式更新,我们有 150 分。图表应该只更新 50 个新的。

有没有办法在 React JavaScript 中做到这一点?

下面是 Java 中的一个试验,它不存储数字,只是可视化。

public void getRandomPointInCircle() 
    double t = 2 * Math.PI * Math.random();
    double r = Math.sqrt(Math.random());
    double x = r * Math.cos(t);
    double y = r * Math.sin(t);
    System.out.println(x);
    System.out.println(y);

Circle - Trial 2

【问题讨论】:

欢迎来到 Stack Overflow!请使用tour(你会得到一个徽章!)并通读help center,尤其是How do I ask a good question?你最好的选择是做你的研究,search关于SO的相关主题,然后试一试. 如果您在进行更多研究和搜索后遇到困难并且无法摆脱困境,请发布您的尝试minimal reproducible example,并具体说明您卡在哪里。人们会很乐意提供帮助。这里没有什么特别针对 React 的,数学是一样的,JS 拥有 Java 代码用来执行此操作的所有东西...... 你可能想重新发明***,请查看 google maps api 或 mapbox api.. 它是 github 上的开源代码.. 抱歉,不使用 google maps api..canva? 【参考方案1】:

React 可能特别适合这项任务。运行下面的 sn -p 看看它是否工作。

确保 react 只渲染新元素的技巧是在每个渲染的圆圈上使用唯一的 key 道具。未更改的键不会重新渲染。

class App extends React.Component 
  constructor() 
    super();
    this.state = 
      points: []
    ;
  

  getRandomPointInCircle() 
    const t = 2 * Math.PI * Math.random();
    const r = Math.sqrt(Math.random());
    const cx = r * Math.cos(t);
    const cy = r * Math.sin(t);
    const fill = '#'+(Math.random()*0xFFFFFF<<0).toString(16);
    return cx, cy, fill, r:"0.02";
  
  addPoints = () => 
    const points = this.state.points.concat(
      new Array(20).fill().map(p => this.getRandomPointInCircle())
    );
    this.setState(points)
  

  render() 
    const points = this.state;
    return (
      <div>
      <button onClick=this.addPoints>Add 20 points</button><br/>
        <svg style=overflow:'visible'  viewBox="-1 -1 2 2">
          <rect   x="-1" y="-1" fill="#efefef" />
          <circle cx=0 cy=0r=1 fill="#ffffff" />
          points.map((p,index)=>(
            <circle
              key=`$p.x-$p.y-$index`
              ...p
            />
          ))
        </svg>
      </div>
    );
  


// Render it
ReactDOM.render(
  <App />,
  document.getElementById("react")
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="react"></div>

【讨论】:

很棒的代码!我试着写一些类似的东西,但是,有没有办法让它们首先在中心形成,然后传播到整个圆圈?在此示例中,点分散在整个空间中……这不是我要寻找的东西 @Johnny 当然,通过存储和增加 getRandomPointInCircle 函数中使用的直径 (2) 好的,所以我们基本上创建了另一个公式来操作半径;说 - time2 = radius (random max 5) .. time5 = radius (random up to 20)?【参考方案2】:

我认为你在这里看到的是一个有状态的组件(React 擅长处理它)。这个组件可以存储点的个数和每个位置,每次添加一个新的点,都会调用set state方法,新的State,就是前一个加上新的点。

class Circle extends React.Component 

  constructor(props) 
    this.state = points : [], npoints : 0
  

  render() 
    return (
      <div className="circle">... implement this render view ...
        <Points data=this.state.points></Points>
      </div>
    );
  

  addNewPoints()
    let newPoints = [...this.state.points];
    newPoints.push(this.generateNewPoints());
    newState = points :newPoints , npoints : newPoints.length
    this.setState(newState);
   

  generateNewPoints()
    //getRandomPointInCircle ...
  


【讨论】:

以上是关于Unity3d在屏幕范围内随机生成一个圆的主要内容,如果未能解决你的问题,请参考以下文章

《Unity3d-在地图中随机生成一个物体的代码》

Unity3d 随机地图生成

unity3d中随机出现图片。

Unity3D_(API)Random随机数

生成随机坐标,存储在圆半径内

Unity3d随机生成地图(Map)