forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Алгоритмика (http://forum.boolean.name/forumdisplay.php?f=21)
-   -   случайная точка внутри кривосторонего треугольника (http://forum.boolean.name/showthread.php?t=5389)

jimon 21.12.2007 19:48

случайная точка внутри кривосторонего треугольника
 
собсно вот :


надо равномерное распределение полученых точек
ps. кривая сторона может быть и не гиперболой .. просто кривая
по форме идентична той что на рисунке

alcoSHoLiK 21.12.2007 19:51

Re: случайная точка внутри кривосторонего треугольника
 
Надо знать уравнение гиперболы. Если же оно неизвестно, как вариант, можно заполнить нужную область какими-то данными (одним цветом). Затем построить апроксимирующую кривую - можно просто прямую, чтобы получился треугольник. И проверять цвет в полученной точке. Если не попал, выбираешь новую точку.
Если уравнение задано, должно быть понятно, как делать.

jimon 21.12.2007 20:33

Re: случайная точка внутри кривосторонего треугольника
 
хм, ладно :) можно значит немного упростить случай
разбить параболу на прямые линии и проводить расчет с етой
областью

.................
в общем разобрался : (если кривая заданна f(x) )

x = rand(x0,x1)
y = rand(f(x-x0)+y0,y1)

осталось подобрать такую кривую :)

alcoSHoLiK 21.12.2007 21:23

Re: случайная точка внутри кривосторонего треугольника
 
f(x) = -a/x не катит типа?)

jimon 21.12.2007 21:55

Re: случайная точка внутри кривосторонего треугольника
 
alcoSHoLiK
не катит типа :)

Diplomat 21.12.2007 21:57

Re: случайная точка внутри кривосторонего треугольника
 
Навскидку, тупейший вариант- это генерировать точки до тех пор, пока одна из них не попадёт внутрь фигуры.

Код:

REPEAT
 RndX=RND(FigWidth)
 RndY=RND(FigHeight)
 FigY=RndX^2 ;тут формула, описывающая криволинейную сторону твоей фигуры
UNTIL RndY>FigY

Более логичный- это генерировать сначала точку на абсциссе, а потом, скача от нее - строить соответствующую точку на ординате.
Код:

RndX=RND(FigWidth)
FigH#=RndX^2 ; тут- формула, описывающая твою кривую "гипотенузу"
RndY=RND(FigH)

P.S. Тут для простоты считается, что фигура лежит в начале координат- исправить для произвольного расположения не сложно. Методы ессно не заработают, если фигура будет повёрнута на произвольный угол, т.е. ёё координатная система не будет совпадать с глобальной... Хотя- заработают. Нужно будет просто заюзать Sin/Cos и "повернуть" глобальные координаты найденной точки на "локальный" угол поворота фигуры.

jimon 21.12.2007 22:14

Re: случайная точка внутри кривосторонего треугольника
 
вот примерно то что мне надо :)
Код:

Graphics 800,600,0,0

Global x0# = 200
Global y0# = 100
Global x1# = 400
Global y1# = 300

Function f(x#)
If x < (x1-x0)/1.5 Then
        Return x - x/2
Else
        Return x - ((x1-x0)-x)
End If
End Function


While Not (KeyHit(key_escape) Or AppTerminate())

SetColor 255,255,255
DrawLine  x1,y0,x1,y1
DrawLine  x0,y1,x1,y1

SetColor 128,128,128
For x# = x0 To x1

DrawRect x,-f(x-x0)+y1,1,1

Next

x# = Rand(x0,x1)
y# = Rand(-f(x-x0)+y1,y1)

SetColor 255,0,0
DrawRect x,y,1,1

Flip

Wend

всем спасибо, все свободны :)

ABTOMAT 22.12.2007 00:30

Re: случайная точка внутри кривосторонего треугольника
 
ИМХО сначала следует вычислить случайную точку в пределах прямоугольника (0,высота фигуры, 0, -ширина фигуры), а затем проверить, принадлежит ли она этому эмм, треугольнику, и только если принадлежит, то рисовать её - хоть это и не слишком-то рационально, но зато поможет избавиться от скопления точек в левой части фигуры.

jimon 22.12.2007 00:49

Re: случайная точка внутри кривосторонего треугольника
 
ABTOMAT
это тупо, перечитай тему


Часовой пояс GMT +4, время: 14:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot