Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >生成C中特定平面上的随机点

生成C中特定平面上的随机点
EN

Stack Overflow用户
提问于 2015-03-30 08:05:40
回答 3查看 5.1K关注 0票数 3

我有一个三维的二维平面: x+y+z=1,我想生成平面上的随机点(x,y,z)。如何选择这些点,使它们均匀分布?

EN

回答 3

Stack Overflow用户

发布于 2015-03-30 11:05:59

问题

如评论中所述,这一问题列于“具体规定”之下。尽管如此,这还是一个有趣的问题。因为没有分发我刚选了一个。以下是更精确的/general(?)问题我会回答:

假设我在R^3中有一个由ax + by + cz = d定义的平面ax + by + cz = d。 让c位于最接近原点的P上。 怎样才能在P上统一地选择c半径内的一个点?

算法

n = (a,b,c)nP的法线向量。

方向

  1. 在平面ax + by + cz = d上生成任意非零向量,称之为w.你可以用n的交叉乘积和任何非零向量,而不是平行于n,来实现这一点。
  2. w中以随机角度旋转n。您可以使用formula来完成这个任务。
  3. 所以,现在你通过规范化它得到了方向
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
direction = direction  /  direction.magnitude

射线起源

  1. 如果d是0,我们就完了。否则:
  2. 计算c=平面距离Vector3(0,0,0) 根据plane的说法。
  3. 射线的翻译起源
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 origin of the ray = vector3.zero +  c * ( n )

刻度=random.range(最小,最大)

所以重点是

  • origin_of_the_ray + scale * (direction_)

“守则”

这里是我的C实现算法。我从头到尾写了所有的矢量机器,所以有点混乱。我还没有对此进行彻底的测试。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>

typedef struct {
    double x, y, z;
} vec3;

vec3 vec(double x, double y, double z);
vec3 crossp(vec3 u, vec3 v);
vec3 add(vec3 u, vec3 v);
double dotp(vec3 u, vec3 v);
double norm2(vec3 u);
double norm(vec3 u);
vec3 scale(vec3 u, double s);
vec3 normalize(vec3 u);
void print_vec3(vec3 u);

// generates a random point on the plane ax + by + cz = d
vec3 random_on_plane(double r, double a, double b, double c, double d) {
    // The normal vector for the plane
    vec3 n = vec(a, b, c);

    // create a normal vector on the plane ax + by + cz = 0
    // we take any vector not parallel to n
    // and find the cross product
    vec3 w;
    if (n.x == 0)
        w = crossp(n, vec(1,0,0));
    else
        w = crossp(n, vec(0,0,1));

    // rotate the vector around n by a random angle
    // using Rodrigues' rotation formula
    // http://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
    double theta = ((double)rand() / RAND_MAX) * M_PI;
    vec3 k = normalize(n);
    w = add(scale(w, cos(theta)),
            scale(crossp(k, w), sin(theta)));

    // Scale the vector fill our disk.
    // If the radius is zero, generate unit vectors
    if (r == 0) {
        w = scale(w, r/norm(w));
    } else {
        double rand_r = ((double)rand() / RAND_MAX) * r;
        w = scale(w, rand_r/norm(w));
    }

    // now translate the vector from ax + by + cz = 0
    // to the plane ax + by + cz = d
    // http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_plane
    if (d != 0) {
        vec3 t = scale(n, d / norm2(n));
        w = add(w, t);
    }

    return w;
}

int main(void) {
    int i;
    srand(time(NULL));

    for (i = 0; i < 100; i++) {
        vec3 r = random_on_plane(10, 1, 1, 1, 1);
        printf("random v = ");
        print_vec3(r);
        printf("sum = %f, norm = %f\n", r.x + r.y + r.z, norm(r));
    }
}

vec3 vec(double x, double y, double z) {
    vec3 u;
    u.x = x;
    u.y = y;
    u.z = z;
    return u;
}

vec3 crossp(vec3 u, vec3 v) {
    vec3 w;
    w.x = (u.y * v.z) - (u.z * v.y);
    w.y = (u.z * v.x) - (u.x * v.z);
    w.z = (u.x * v.y) - (u.y * v.x);
    return w;
}

double dotp(vec3 u, vec3 v) {
    return (u.x * v.x) + (u.y * v.y) + (u.z * v.z);
}

double norm2(vec3 u) {
    return dotp(u, u);
}

double norm(vec3 u) {
    return sqrt(norm2(u));
}

vec3 scale(vec3 u, double s) {
    u.x *= s;
    u.y *= s;
    u.z *= s;
    return u;
}

vec3 add(vec3 u, vec3 v) {
    u.x += v.x;
    u.y += v.y;
    u.z += v.z;
    return u;
}

vec3 normalize(vec3 u) {
    return scale(u, 1/norm(u));
}

void print_vec3(vec3 u) {
    printf("%f %f %f\n", u.x, u.y, u.z);
}
票数 6
EN

Stack Overflow用户

发布于 2015-03-30 08:21:08

Eugene几乎是正确的:在区间[0,1]上生成两个随机数,称它们为A,B,然后x= min(A,B),y= max(A,B) - x,z=1- (x + y)。基本上,你在[0,1]线上选择两个点,而你的三个坐标是这两个点定义的三个区间。

票数 2
EN

Stack Overflow用户

发布于 2015-03-30 08:15:21

我先给你一个简单的算法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
x = rand()
y = rand()
z = 1 - x - y

现在让我们看看该算法的一个实现。

此代码将生成任意类型的数字( +ve或-ve )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main()
  {
    srand(time(NULL));
    int x= ( rand() - rand() )  ;
    int y= ( rand() - rand() )  ;
    int z=1-x-y;
    printf("x=%d y=%d z=%d",x,y,z); 
  }

只需使用srand()创建随机数生成器,并使用rand()分配随机数。

如果需要创建带有范围的随机数,则使用rand() % ( maxnumber + 1 ),其中maxnumber是所需的最大值。

如果你希望你所有的数字都是正数,那就试试这个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
  {
    srand(time(NULL));  
    int x, y , z = -1;
    while ( z < 0 ) 
     {
      x = rand()  ;
      y = rand() ;
      z = 1 - (x + y );
     }
    printf("x=%d y=%d z=%d",x,y,z); 
  }

警告

上面的代码可能需要一些时间来执行,所以不要期望立即得到结果。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29350965

复制
相关文章
Apache、tomcat、Jboss、weblogic、WebSphere区别和容器的作用
总结:Apache/Tomcat/JBOSS/Nginx区别 . 1、Apache是Web服务器,Tomcat是应用(Java)服务器。Tomcat在中小型系统和并发访问用户不是很多的场合下被普遍使用。Apache支持静态页,Tomcat支持动态的。 2、Jetty:Tomcat内核作为其Servlet容器引擎,并加以审核和调优.大中型系统可以应用。能够提供数据库连接池服务,还支持其他 Web 技术的集成,譬如PHP、.NET 两大阵营. 3、JBoss是一个管理EJB的容器和服务器,但JBoss核心
小小科
2018/05/02
3.7K0
Exploiting Jolokia Agent with Java EE Servers
0x00 - About Jolokia Jolokia 是一个通过 HTTP 的 JMX 连接器,提供了类 RESTful 的操作方式,可以通过 POST JSON 的方式访问和修改 JMX 属性、执行 JMX 操作、搜索 MBean、列出 MBean 的 Meta-data 等。 Jolokia 支持提供了多种 Agents,包括 WAR Agent、OSGi Agent、JVM Agent 或者 Mule Agent。其中 WAR Agent 支持了多种 Web Server: JBoss 4.
云鼎实验室
2018/04/02
1.7K0
Exploiting Jolokia Agent with Java EE Servers
flowable camunda activiti 功能对比
flowable camunda activiti 三个框架都是从jbpm框架诞生出来的,先是有jbpm4,然后出来了一个activiti5,activiti5发展一段时间,又出来了一个Camunda。activiti5发展了4年,紧接着出来了一个flowable。本文重点对flowable camunda两个框架的功能对比。对比的camunda版本是7.10.0,flowable框架的版本是6.4.1.
全栈程序员站长
2022/08/31
8.3K1
flowable camunda activiti 功能对比
Migrating to WebSphere 9
Migrating to WebSphere 9 Make a migration plan Requirements Migrate WebSphere profiles into the new WebSphere Keep profiles' locations as the original path Prepare Install the new WebSphere Setup variables At first, we need to record variables related to
绿巨人
2018/05/16
9480
在eclipse中使用Tomcat8.5时,出现了如下错误:
在建立Tomcat服务时,eclipse会自动生成一个Servers的项目. 在这个项目中,找到你部署项目的服务文件夹. 在这个文件夹下有一个"server.xml"文件,打开这个文件,删除里面对应项目的Context节点即可。
兮动人
2021/06/11
3.7K0
在eclipse中使用Tomcat8.5时,出现了如下错误:
Tomcat原理剖析-tomcat介绍和源码idea构建
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。
程序猿川子
2022/08/10
7880
8.5 DebuggerPresent
CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用。函数接收两个参数进程句柄和一个指向布尔值的指针。如果指定的进程正在被调试,则函数会把指向布尔值的指针设为 TRUE,否则设为FALSE。
微软技术分享
2023/09/27
1610
8.5 DebuggerPresent
【JAVA调错】----JBoss发布多个项目时抛出webAppRootKey错误
进行如上配置后,修改log4j.xml后,在刷新间隔时间后,配置的监听器Log4jConfigListener会重新加载log4j相关配置。
令仔很忙
2018/09/14
1.1K0
迁移Hexo到halo
此前,我使用hexo,犹豫hexo是静态的,有所不便。无意之中发现这款博客框架。此博客使用java所以,内存需求比较高。优点是美观,支持批量导入md。
Innei
2021/12/28
1.2K0
8.5 DebuggerPresent
CheckRemoteDebuggerPresent 也是一个微软提供的反调试函数,该函数可以在本地或者远程进程中使用。函数接收两个参数进程句柄和一个指向布尔值的指针。如果指定的进程正在被调试,则函数会把指向布尔值的指针设为 TRUE,否则设为FALSE。
微软技术分享
2023/10/11
1290
迁移 VPS 到 Vultr
趁着中秋节之前总算是把我的 VPS 迁移到了 Vultr,域名也换了一个 .me 结尾的,更有个人网站的感觉,但是一年下来也得多花不少钱,疼死我了。
kifuan
2022/10/24
18.7K0
迁移 VPS 到 Vultr
迁移 Nginx 到 Envoy
大部分的应用可能还是使用的比较传统的 Nginx 来做服务代理,本文我们将介绍如何将 Nginx 的配置迁移到 Envoy 上来。我们将学到:
我是阳明
2020/06/15
1.3K0
迁移 Nginx 到 Envoy
Linux下Jboss安装使用+Jboss部署脚本「建议收藏」
Jboss是Java EE应用服务器(就像Apache是web服务器一样),专门用来运行Java EE程序的。
全栈程序员站长
2022/09/27
4.9K0
Linux下Jboss安装使用+Jboss部署脚本「建议收藏」
Jboss安装
 1、下载http://pan.baidu.com/s/1bnmYN7p,解压jboss-as-7.1.1.Final.zip即完成安装
week
2018/08/27
1.3K0
8.5 存储紧缩
1、在整个动态存储管理过程中,不管哪个时刻,可利用空间都是一个地址连续的存储区,在编译程序中称之为“堆”,每次分配都是从这个可利用空间中划出一块。
小林C语言
2020/12/12
3980
8.5 存储紧缩
IBM WebSphere MQ 系列(三)配置和使用WebSphere MQ
配置和使用WebSphere MQ A.设置环境变量   在shell中执行MQ的控制命令:     ctrmqm     strmqm   若识别这些命令,则说明PATH环境变量已配置好了;   若提示找不到命令,则说明需配置Linux环境变量,指定MQ的bin路径到PATH:      可选择修改系统的环境变量(/etc/profile文件,对全部用户可见),      或只修改用户mqadmin的环境变量(/var/mqm/.bash_profile,只对当前用户可见。     下面列出前者的修改方式
Java学习123
2018/05/16
6.4K0
JBoss 主要模块
本文介绍了JBoss的主要模块,包括JBoss EJB容器、JBossNS、JBossTX、部署服务、JBossMQ、JBossSX和JBossCX。JBoss EJB容器是JBoss服务器的核心实现,支持热部署。JBossNS提供命名服务,用于定位对象和资源。JBossTX支持JTA/JTS和交易管理。部署服务支持EJB、Web应用和企业级应用的部署。JBossMQ是Java消息服务规范实现。JBossSX支持安全实现,包括基于JAAS的或不支持JAAS机制的安全。JBossCX实现了部分JCA功能。Web服务器支持Web容器和Servlet引擎。
YGingko
2017/12/28
1.5K0
eclipse + JBoss 5 +
有时客户端程序(如JSP、Servlet)会和EJB组件运行在同一个JVM上,如在同一个J2EE服务器(JBoss、Weblogic等)中运行。这时就没必要 再通过远程(remote)接口访问Session Bean了,因为客户端和session bean都在同一个jvm上,只需要通过本地接口(local)访问即可。就象直接访问本地类一样(当然,不能直接访问EJB类,需要使用jndi和local接口来获得本地接口对象。当然,也可以通过remote接口来访问ejb,不过这样会有一些性能损失。就象在同一台机器上还通过socket进行访问一样,很多性能都损耗在网络上了。下面我们来举个简单的例子来看一下如何使用本地接口来访问session bean。     先建立一个session bean本地接口,代码如下:
py3study
2020/01/14
6700
jboss下载和安装[通俗易懂]
1. 下载 http://www.jboss.org/jbossas/downloads/ 选择Certified Java EE 6 Full Profile版本,我下载的是 jboss-as-7.1.1.Final.zip。 2. 解压 jboss-as-7.1.1.Final.zip 注意整个路径必须没有空格才行。 3. 配置环境变量 JRE 环境变量 JAVA_HOME JRE的路径 CLASSPATH %JAVA_HOME%\lib PATH %JAVA_HOME%\bin
全栈程序员站长
2022/09/28
2.5K0
jboss下载和安装[通俗易懂]
点击加载更多

相似问题

Websphere到Jboss的迁移

12

WebLogic8.1到Websphere 8.5迁移

14

IBM websphere到JBOSS的迁移

24

WebSphere8.5应用程序到IBM迁移上的Websphere自由

10

从Tomcat6.0迁移到WebSphere 8.5

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文