查看点是否位于圆的某个百分比内

时间:2017-01-08 13:11:47

标签: c++ math geometry

我自己的数学问题。我知道如何检查一个点是否位于圆圈内:(x-x1)^2 + (y-y1)^2 <= r^2

但我的问题有点不同。我有一定比例的圆圈:圆圈不满,它只是它的一部分(它就像一个进步馅饼)。

我需要查看一个点是否在该百分比内。

如何做到这一点,公式是什么?

这是我的代码:

#include <iostream>
#include <fstream>
#include <cmath>
#define pi 3.14159265
using namespace std;
ifstream fin("sol.in");
ofstream fout("sol.out");
int x,y,p,t,i;
double phi;
int main()
{
    fin>>t;
    for(i=1;i<=t;i++)
    {
        fin>>p>>x>>y;
        phi=atan2(50-y,50-x);
        if(phi<0)phi+=2*pi;
        if(phi<2*pi*p)cout<<"1"<<endl;
        else cout<<"0"<<endl;
    }
    return 0;
}

我的输入文件:

5 0 55 55 12 55 55 13 55 55 99 99 99 87 20 40

2 个答案:

答案 0 :(得分:0)

将角度计算为

var app = app || {};
(function() {
    'use strict';
    //views linitalize
    var views = app.view = app.view || {};
    views.Application = Backbone.View.extend({
        initialize: function() {
           this.$content = this.$('#container');
            //this.$loading = this.$('#loading');
        },
        setContent: function(view, target) {
            var content = this.content;
            var subUrl = this.target;

            if (content) content.remove();
            //if (content || target) content.remove()target.remove();

            content = this.content = view;
            subUrl = this.target = target;

            var templateName = subUrl;
            var tmpl_dir = '../assets/static';
            var tmpl_url = tmpl_dir + '/' + templateName + '.html';
            var tmpl_string = '';

            $.ajax({
                url: tmpl_url,
                method: 'GET',
                async: false,
                dataType : 'html',
                success: function (data) {
                    tmpl_string = data;
                }
            });
            console.log(tmpl_string);
            this.$content.html(content.render(tmpl_string).el);
        },
        showSpinner: function() {
          this.$loading.show();
        },
        hideSpinner: function() {
          this.$loading.hide();
        }
    });
    views.Home = Backbone.View.extend({
      render: function(templateName) {
        var template = _.template(templateName);
        this.$el.html(template);
        return this;
      }
    });

并比较

phi = atan2(y-y1, x-x1);
if(phi<0) phi += 2*Pi;

答案 1 :(得分:0)

在极坐标系中工作。

在这样的系统中,M点由(r, t)对表示,其中r是从O原点到M的距离, t是x轴和(OM)线之间的逆时针角度。

此外,r严格为正,而t位于[0, 2*Pi[(我选择的代表中),并且是弧度。

从笛卡尔坐标系中,极坐标如下:

  

r = sqrt(x ^ 2 + y ^ 2)

     

t = atan2(-y,-x)+ Pi

(更多关于wikipedia

我假设你是在三角方向上从x轴计算你的圆圈百分比,所以你会有这样的事情:

0.6 circle

首先,如果r大于您的圆的半径,那么M就在圆圈之外。

否则,假设你有p个圆圈,那么0 <= p <= 1。在弧度中,这等于2*Pi*p

由于t2*Pi*p都在[0, 2*Pi[范围内,您可以直接比较它们:如果t > 2*Pi*p,那么M就在圈外

现在,对于公式,如果您有(x, y)点和(R, p)半径R半径和p百分比,则必要且充分条件为:< / p>

(x, y) in (R, p) <=> sqrt(x^2 + y^2) <= R AND atan2(-y, -x) + Pi <= 2*Pi*p