美文网首页
在三角形中随机取点

在三角形中随机取点

作者: 贾佳菊 | 来源:发表于2015-07-08 22:57 被阅读301次

方法:

如下图,一个三角形 ABC ,延长任意两条边做一个平行四边形。

三角形 - 平行四边形.png

我们知道,向量 AB + 向量 BC 是 向量 AD 。AB 与 AC 不平行,可做为平面内一组基底。这样,平面内所有点都可以根据 AB 和 AC 以及点 A 得到。我们只需要得到平行四边形 ABDC 中的点,然后把三角形 BCD 中的点对称到 ABC 中就可以了。

代码实现(iOS_Objective-C):

为了简单,选用了 UIBezier 方式在 UIView 中绘制。

- (void)drawRect:(CGRect)rect {
CGFloat viewWidth = self.frame.size.width;
CGFloat viewHeight = self.frame.size.height;

CGFloat x0 = arc4random() % (int)viewWidth;
CGFloat y0 = arc4random() % 50;

CGFloat x1 = arc4random() % 100;
CGFloat y1 = arc4random() % 100 + viewHeight - 100;

CGFloat x2 = arc4random() % 80 + viewWidth - 80;
CGFloat y2 = arc4random() % 80 + viewHeight - 80;

CGPoint point0 = CGPointMake(x0, y0);
CGPoint point1 = CGPointMake(x1, y1);
CGPoint point2 = CGPointMake(x2, y2);

UIBezierPath *bezierPath = [[UIBezierPath alloc] init];

[bezierPath moveToPoint:point0];
[bezierPath addLineToPoint:point1];
[bezierPath addLineToPoint:point2];
[bezierPath addLineToPoint:point0];

[[UIColor blackColor] set];
[bezierPath stroke];

for (int index = 0; index < 10000; index++){
    UIBezierPath *pointBezierPath = [[UIBezierPath alloc] init];
    CGPoint point = [self getPointWithPoint0:point0 Point1:point1 Point2:point2];
    [pointBezierPath addArcWithCenter:point radius:1 startAngle:0 endAngle:M_PI * 2 clockwise:YES];
    [[UIColor redColor] set];
    [pointBezierPath stroke];
    [pointBezierPath fill];
}
}

- (CGPoint)getPointWithPoint0:(CGPoint)point0 Point1:(CGPoint)point1 Point2:(CGPoint) point2{

CGPoint vector0 = CGPointMake(point1.x - point0.x, point1.y - point0.y);
CGPoint vector1 = CGPointMake(point2.x - point0.x, point2.y - point0.y);

CGFloat t1 = 0;
CGFloat t2 = 0;

do {
    
    t1 = (CGFloat)(1 + arc4random() % 99) / 100;
    t2 = (CGFloat)(1 + arc4random() % 99) / 100;
    
}while( t1 + t2 ==1 );

if (t1 + t2 >= 1){
    t1 = 1 - t1;
    t2 = 1 - t2;
}

CGPoint point = CGPointMake(t1 * vector0.x + t2 * vector1.x + point0.x, t1 * vector0.y + t2 * vector1.y + point0.y);
return point;
}

运行结果如图:

三角形随机取点.png

取了 10000 个点,看起来分布还算均匀,对于要求不太高的场景应该够用了~

相关文章

  • 在三角形中随机取点

    方法: 如下图,一个三角形 ABC ,延长任意两条边做一个平行四边形。 我们知道,向量 AB + 向量 BC 是 ...

  • random

    random 取随机数 取一个随机浮点数。 在1-3取一个随机数数(整型)。 在序列中随机取一个元素。 在序列中随...

  • 三角形内随机取点

    假设我们有3个点,分别是A, B, C,如何在这3个点构成的三角形内随机取点呢?下面我们来看看一些常用的实现方式以...

  • Python之random模块

    import random #取随机数的模块 取随机小数 取随机整数 从一个列表中随机抽取值 打乱一个列表的顺序 ...

  • Java List 随机取记录

    在这对Java List中怎么随机取数做一个分享: 其实List中没有现成随机取记录的方法,但在Collectio...

  • 点是否在三角形内——来自《编程之美》

    问题:如果在一个二维坐标系中,已知三角形三个点的坐标,那么对于坐标系中的任意一点,如何判断该点是否在三角形内(点在...

  • python 随机取 list 中的元素

    随机取 list 中的元素 random.sample

  • 概率题5

    一个随机点均匀地分布在顶点坐标为的三角形中,对于以下方程找到以下事件的概率:

  • js取整和取随机数

    取整: 取随机数 取任意两个数之间的随机数

  • Postgresql 取随机数

    Postgresql 取随机数: 标签:取0和1之间的随机数SELECT RANDOM(); 取介于两数之间的随机...

网友评论

      本文标题:在三角形中随机取点

      本文链接:https://www.haomeiwen.com/subject/ihfyqttx.html