Рассчитать xSteps и ySteps, чтобы получить N очков в круге

Я стараюсь заполнить сетку точками и держу точки только внутри воображаемого круга.

пример

Сначала я сделал это с:createColorDetectionPoints(int xSteps, int ySteps)

Но для меня намного проще установить это с целью:

void ofxDTangibleFinder::createColorDetectionPoints(int nTargetPoints)

Цель не должна быть слишком точной. Но в тот момент, когда я хочу 1000 баллов, например, я получаю 2289 баллов.

Я думаю, что моя логика неверна, но я не могу понять это. Идея состоит в том, чтобы получить правильное количество xSteps и ySteps.

Может кто-нибудь помочь?

void ofxDTangibleFinder::createColorDetectionPoints(int nTargetPoints) {

    colorDetectionVecs.clear();

    // xSteps and ySteps needs to be calculated
    // the ratio between a rect and ellipse is
    // 0.7853982

    int xSteps = sqrt(nTargetPoints);
    xSteps *= 1.7853982; // make it bigger in proportion to the ratio
    int ySteps = xSteps;

    float centerX = (float)xSteps/2;
    float centerY = (float)ySteps/2;

    float fX, fY, d;

    float maxDistSquared = 0.5*0.5;

    for (int y = 0; y < ySteps; y++) {
        for (int x = 0; x < xSteps; x++) {
            fX = x;
            fY = y;
            // normalize
            fX /= xSteps-1;
            fY /= ySteps-1;

            d = ofDistSquared(fX, fY, 0.5, 0.5);

            if(d <= maxDistSquared) {
                colorDetectionVecs.push_back(ofVec2f(fX, fY));
            }
        }
    }

//    for(int i = 0; i < colorDetectionVecs.size(); i++) {
//        printf("ellipse(%f, %f, 1, 1);\n", colorDetectionVecs[i].x*100, colorDetectionVecs[i].y*100);
//    }


    printf("colorDetectionVecs: %lu\n", colorDetectionVecs.size());


}

0 ответов

Другие вопросы по тегам