Find Original & JiFen

#include <QtCore/QCoreApplication>

#include <cmath>
 
typedef double DataType;
typedef long TimeType;
typedef struct
{
  DataType UA;
  DataType IA;
  DataType UB;
  DataType IB;
  DataType UC;
  DataType IC;
  TimeType T;
} Node;
 
 
typedef struct
{
    double HZ;
    double Voltage;
} ConfigType;
 
#define MAX_LEN 360
Node n[MAX_LEN];
void Init(Node * pN, int sz)
{
    for(int i = 0; i < sz; ++i)
    {
        pN[i].UA = ::sin(1.0+i);
        pN[i].IA = ::sin(2.0 + i);
        pN[i].UB = ::sin(3.0 + i);
        pN[i].IB = ::sin(4.0 + i);
        pN[i].UC = ::sin(5.0 + i);
        pN[i].IC = ::sin(6.0 + i);
        pN[i].T  = 1000 + i;
    }
}
#define MIN_DOUBLE_ZERO     0.000000001
bool IsOrignalUA(Node * pN, int i)
{
    if((pN[i].UA > -MIN_DOUBLE_ZERO && pN[i].UA <= MIN_DOUBLE_ZERO) && pN[i+1].UA > 0)
    {
        return true;
    }
    if(pN[i].UA <0 && pN[i+1].UA > 0)
    {
        return true;
    }
    return false;
}
bool IsValidWidth(int iLastUA, int iCurUA, Node * pN, double width)
{
    if(pN[iCurUA].T - pN[iLastUA].T <= width)
    {
        return false;
    }
    return true;
}
#define CIRCLE_TIME           8
#define tolence     0.20
 
int FindNextSpot(int iStart, Node *pN, int len)
{
    for(int i = iStart; i < len; ++i)
    {
        if(IsOrignalUA(pN, i))
        {
            return i;
        }
    }
    return -1;
}
 
int Run(Node * pN, int len)
{
    int cnt = 0;
    int i = 0;
    while(i < len)
    {
        int cur = FindNextSpot(i, pN, len);
        if(cur == -1) // no spot -> end
        {
            break;
        }
 
        int next = cur;
        do
        {
            next = FindNextSpot(next + 1, pN, len );
            if(next == -1)
            {
                break;
            }
        }while(false == IsValidWidth(cur, next, pN, CIRCLE_TIME*tolence));
        if(next == -1) // can not find the next, -> end
        {
            break;
        }
        cnt++;
        printf("id %d, cur %d, next %d, T %d, (%f, %f) \n", cnt, cur, next, pN[next].T - pN[cur].T, pN[cur].UA, pN[cur+1].UA);
 
        i = next;
    }
    printf("cnt %d\n", cnt);
    return 0;
}
#include <vector>
#include <utility>
 
std::vector<std::pair<int, int> > UAIndex;
#define TOP_HIGH    1
#define Ratio_Top_High 0.20
int NormalRun(Node * pN, int sz)
{
    double MinUA = 0;
    double MaxUA = 0;
    for(int i = 0; i < sz; ++i)
    {
        if(MinUA > pN[i].UA)
        {
            MinUA = pN[i].UA;
        }
        if(MaxUA < pN[i].UA)
        {
            MaxUA = pN[i].UA;
        }
        if(IsOrignalUA(pN, i))
        {
            unsigned int sz = UAIndex.size();
            if(sz == 0)
            {
                UAIndex.push_back(std::make_pair(i,0));
            }
            else
            {
                if(MaxUA - MinUA > TOP_HIGH * Ratio_Top_High)
                {
                    UAIndex[sz-1].second = i;
                    UAIndex.push_back(std::make_pair(i,0));
                }
            }
        }
    }
    if(UAIndex[UAIndex.size()-1].second == 0)
    {
       UAIndex.pop_back();
    }
 
    for(unsigned int i = 0; i < UAIndex.size(); ++i)
    {
        printf(" first %d second %d T %d (%f, %f) \n", UAIndex[i].first, UAIndex[i].second
               , pN[UAIndex[i].second].T - pN[UAIndex[i].first].T
               , pN[UAIndex[i].first].UA, pN[UAIndex[i].first+1].UA);
    }
    printf("Size of Zero Vector %d max %f, min %f\n", UAIndex.size(), MaxUA, MinUA);
    return 0;
}
 
void Angle()
{
    Init(n, MAX_LEN);
    Run(n, MAX_LEN);
    NormalRun(n, MAX_LEN);
    // Other
}
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    Angle();
    return a.exec();
}
 

 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值