亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dgnstroke.cpp

?? 支持各種柵格圖像和矢量圖像讀取的庫
?? CPP
字號:
/****************************************************************************** * $Id: dgnstroke.cpp 10646 2007-01-18 02:38:10Z warmerdam $ * * Project:  Microstation DGN Access Library * Purpose:  Code to stroke Arcs/Ellipses into polylines. * Author:   Frank Warmerdam, warmerdam@pobox.com * ****************************************************************************** * Copyright (c) 2001, Avenza Systems Inc, http://www.avenza.com/ * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************/#include "dgnlibp.h"#include <math.h>CPL_CVSID("$Id: dgnstroke.cpp 10646 2007-01-18 02:38:10Z warmerdam $");#define DEG_TO_RAD (PI/180.0)/************************************************************************//*                         ComputePointOnArc()                          *//************************************************************************/static void ComputePointOnArc2D( double dfPrimary, double dfSecondary,                                  double dfAxisRotation, double dfAngle,                                 double *pdfX, double *pdfY ){    double      dfRadiusSquared, dfRadius, dfX2, dfY2;    double      dfCosAngle = cos(dfAngle);    double      dfSinAngle = sin(dfAngle);    double      dfPrimarySquared = dfPrimary * dfPrimary;    double      dfSecondarySquared = dfSecondary * dfSecondary;    dfRadiusSquared = (dfPrimarySquared * dfSecondarySquared)        / (dfSecondarySquared * dfCosAngle * dfCosAngle           + dfPrimarySquared * dfSinAngle * dfSinAngle);    dfRadius = sqrt(dfRadiusSquared);    dfX2 = dfRadius * cos(dfAngle);    dfY2 = dfRadius * sin(dfAngle);    *pdfX = dfX2 * cos(dfAxisRotation) - dfY2 * sin(dfAxisRotation);    *pdfY = dfX2 * sin(dfAxisRotation) + dfY2 * cos(dfAxisRotation);}/************************************************************************//*                            DGNStrokeArc()                            *//************************************************************************//** * Generate a polyline approximation of an arc. * * Produce a series of equidistant (actually equi-angle) points along * an arc.  Currently this only works for 2D arcs (and ellipses).  * * @param hFile the DGN file to which the arc belongs (currently not used). * @param psArc the arc to be approximated. * @param nPoints the number of points to use to approximate the arc. * @param pasPoints the array of points into which to put the results.  * There must be room for at least nPoints points. * * @return TRUE on success or FALSE on failure. */int DGNStrokeArc( DGNHandle hFile, DGNElemArc *psArc,                   int nPoints, DGNPoint * pasPoints ){    double      dfAngleStep, dfAngle;    int         i;    if( nPoints < 2 )        return FALSE;    if( psArc->primary_axis == 0.0 || psArc->secondary_axis == 0.0 )    {        CPLError( CE_Warning, CPLE_AppDefined,                   "Zero primary or secondary axis in DGNStrokeArc()." );        return FALSE;    }    dfAngleStep = psArc->sweepang / (nPoints - 1);    for( i = 0; i < nPoints; i++ )    {        dfAngle = (psArc->startang + dfAngleStep * i) * DEG_TO_RAD;                ComputePointOnArc2D( psArc->primary_axis,                              psArc->secondary_axis,                             psArc->rotation * DEG_TO_RAD,                             dfAngle,                             &(pasPoints[i].x),                             &(pasPoints[i].y) );        pasPoints[i].x += psArc->origin.x;        pasPoints[i].y += psArc->origin.y;        pasPoints[i].z = psArc->origin.z;    }    return TRUE;}/************************************************************************//*                           DGNStrokeCurve()                           *//************************************************************************//** * Generate a polyline approximation of an curve. * * Produce a series of equidistant points along a microstation curve element. * Currently this only works for 2D. * * @param hFile the DGN file to which the arc belongs (currently not used). * @param psCurve the curve to be approximated. * @param nPoints the number of points to use to approximate the curve. * @param pasPoints the array of points into which to put the results.  * There must be room for at least nPoints points. * * @return TRUE on success or FALSE on failure. */int DGNStrokeCurve( DGNHandle hFile, DGNElemMultiPoint *psCurve,                     int nPoints, DGNPoint * pasPoints ){    int         k, nDGNPoints, iOutPoint;    double      *padfMx, *padfMy, *padfD, dfTotalD = 0, dfStepSize, dfD;    double      *padfTx, *padfTy;    DGNPoint    *pasDGNPoints = psCurve->vertices;    nDGNPoints = psCurve->num_vertices;    if( nDGNPoints < 6 )        return FALSE;    if( nPoints < nDGNPoints - 4 )        return FALSE;/* -------------------------------------------------------------------- *//*      Compute the Compute the slopes/distances of the segments.       *//* -------------------------------------------------------------------- */    padfMx = (double *) CPLMalloc(sizeof(double) * nDGNPoints);    padfMy = (double *) CPLMalloc(sizeof(double) * nDGNPoints);    padfD  = (double *) CPLMalloc(sizeof(double) * nDGNPoints);    padfTx = (double *) CPLMalloc(sizeof(double) * nDGNPoints);    padfTy = (double *) CPLMalloc(sizeof(double) * nDGNPoints);    for( k = 0; k < nDGNPoints-1; k++ )    {        padfD[k] = sqrt( (pasDGNPoints[k+1].x-pasDGNPoints[k].x)                           * (pasDGNPoints[k+1].x-pasDGNPoints[k].x)                         + (pasDGNPoints[k+1].y-pasDGNPoints[k].y)                           * (pasDGNPoints[k+1].y-pasDGNPoints[k].y) );        if( padfD[k] == 0.0 )        {            padfD[k] = 0.0001;            padfMx[k] = 0.0;            padfMy[k] = 0.0;        }        else        {            padfMx[k] = (pasDGNPoints[k+1].x - pasDGNPoints[k].x) / padfD[k];            padfMy[k] = (pasDGNPoints[k+1].y - pasDGNPoints[k].y) / padfD[k];        }        if( k > 1 && k < nDGNPoints - 3 )            dfTotalD += padfD[k];    }/* -------------------------------------------------------------------- *//*      Compute the Tx, and Ty coefficients for each segment.           *//* -------------------------------------------------------------------- */    for( k = 2; k < nDGNPoints - 2; k++ )    {        if( fabs(padfMx[k+1] - padfMx[k]) == 0.0            && fabs(padfMx[k-1] - padfMx[k-2]) == 0.0 )        {            padfTx[k] = (padfMx[k] + padfMx[k-1]) / 2;        }        else        {            padfTx[k] = (padfMx[k-1] * fabs( padfMx[k+1] - padfMx[k])                    + padfMx[k] * fabs( padfMx[k-1] - padfMx[k-2] ))           / (ABS(padfMx[k+1] - padfMx[k]) + ABS(padfMx[k-1] - padfMx[k-2]));        }        if( fabs(padfMy[k+1] - padfMy[k]) == 0.0            && fabs(padfMy[k-1] - padfMy[k-2]) == 0.0 )        {            padfTy[k] = (padfMy[k] + padfMy[k-1]) / 2;        }        else        {            padfTy[k] = (padfMy[k-1] * fabs( padfMy[k+1] - padfMy[k])                    + padfMy[k] * fabs( padfMy[k-1] - padfMy[k-2] ))            / (ABS(padfMy[k+1] - padfMy[k]) + ABS(padfMy[k-1] - padfMy[k-2]));        }    }/* -------------------------------------------------------------------- *//*      Determine a step size in D.  We scale things so that we have    *//*      roughly equidistant steps in D, but assume we also want to      *//*      include every node along the way.                               *//* -------------------------------------------------------------------- */    dfStepSize = dfTotalD / (nPoints - (nDGNPoints - 4) - 1);/* ==================================================================== *//*      Process each of the segments.                                   *//* ==================================================================== */    dfD = dfStepSize;    iOutPoint = 0;    for( k = 2; k < nDGNPoints - 3; k++ )    {        double  dfAx, dfAy, dfBx, dfBy, dfCx, dfCy;/* -------------------------------------------------------------------- *//*      Compute the "x" coefficients for this segment.                  *//* -------------------------------------------------------------------- */        dfCx = padfTx[k];        dfBx = (3.0 * (pasDGNPoints[k+1].x - pasDGNPoints[k].x) / padfD[k]                - 2.0 * padfTx[k] - padfTx[k+1]) / padfD[k];        dfAx = (padfTx[k] + padfTx[k+1]                 - 2 * (pasDGNPoints[k+1].x - pasDGNPoints[k].x) / padfD[k])            / (padfD[k] * padfD[k]);/* -------------------------------------------------------------------- *//*      Compute the Y coefficients for this segment.                    *//* -------------------------------------------------------------------- */        dfCy = padfTy[k];        dfBy = (3.0 * (pasDGNPoints[k+1].y - pasDGNPoints[k].y) / padfD[k]                - 2.0 * padfTy[k] - padfTy[k+1]) / padfD[k];        dfAy = (padfTy[k] + padfTy[k+1]                 - 2 * (pasDGNPoints[k+1].y - pasDGNPoints[k].y) / padfD[k])            / (padfD[k] * padfD[k]);/* -------------------------------------------------------------------- *//*      Add the start point for this segment.                           *//* -------------------------------------------------------------------- */        pasPoints[iOutPoint].x = pasDGNPoints[k].x;        pasPoints[iOutPoint].y = pasDGNPoints[k].y;        pasPoints[iOutPoint].z = 0.0;        iOutPoint++;/* -------------------------------------------------------------------- *//*      Step along, adding intermediate points.                         *//* -------------------------------------------------------------------- */        while( dfD < padfD[k] && iOutPoint < nPoints - (nDGNPoints-k-1) )        {            pasPoints[iOutPoint].x = dfAx * dfD * dfD * dfD                                   + dfBx * dfD * dfD                                   + dfCx * dfD                                    + pasDGNPoints[k].x;            pasPoints[iOutPoint].y = dfAy * dfD * dfD * dfD                                   + dfBy * dfD * dfD                                   + dfCy * dfD                                    + pasDGNPoints[k].y;            pasPoints[iOutPoint].z = 0.0;            iOutPoint++;            dfD += dfStepSize;        }        dfD -= padfD[k];    }/* -------------------------------------------------------------------- *//*      Add the start point for this segment.                           *//* -------------------------------------------------------------------- */    while( iOutPoint < nPoints )    {        pasPoints[iOutPoint].x = pasDGNPoints[nDGNPoints-3].x;        pasPoints[iOutPoint].y = pasDGNPoints[nDGNPoints-3].y;        pasPoints[iOutPoint].z = 0.0;        iOutPoint++;    }/* -------------------------------------------------------------------- *//*      Cleanup.                                                        *//* -------------------------------------------------------------------- */    CPLFree( padfMx );    CPLFree( padfMy );    CPLFree( padfD );    CPLFree( padfTx );    CPLFree( padfTy );    return TRUE;}/************************************************************************//*                                main()                                *//*                                                                      *//*      test mainline                                                   *//************************************************************************/#ifdef notdefint main( int argc, char ** argv ){    if( argc != 5 )    {        printf( "Usage: stroke primary_axis secondary_axis axis_rotation angle\n" );        exit( 1 );    }    double      dfX, dfY, dfPrimary, dfSecondary, dfAxisRotation, dfAngle;    dfPrimary = atof(argv[1]);    dfSecondary = atof(argv[2]);    dfAxisRotation = atof(argv[3]) / 180 * PI;    dfAngle = atof(argv[4]) / 180 * PI;    ComputePointOnArc2D( dfPrimary, dfSecondary, dfAxisRotation, dfAngle,                          &dfX, &dfY );    printf( "X=%.2f, Y=%.2f\n", dfX, dfY );    exit( 0 );}#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一二三四高清不卡| 亚洲精品视频在线看| 精品国产一区二区三区av性色| 91精品视频网| 亚洲精品一区二区三区蜜桃下载 | 蜜臀精品久久久久久蜜臀| 老司机精品视频在线| 经典三级视频一区| 不卡视频在线看| 欧美日韩电影在线| 欧美成人aa大片| 最好看的中文字幕久久| 奇米一区二区三区| 99久久久精品| 欧美成人综合网站| 亚洲激情男女视频| 国产高清久久久| 欧美裸体bbwbbwbbw| 欧美国产精品久久| 日韩国产精品大片| 99视频精品在线| 精品国产自在久精品国产| 亚洲精品国产第一综合99久久| 免费观看在线综合色| 99国产精品久久久久| 久久先锋影音av鲁色资源| 一区二区三区在线视频免费观看 | 欧美亚一区二区| 中文在线一区二区| 国产精品自拍一区| 日韩精品在线网站| 蜜臀va亚洲va欧美va天堂| 91久久一区二区| 亚洲欧美日韩国产中文在线| 国产一区二区三区久久悠悠色av| 欧美日韩国产综合草草| 一区二区欧美精品| 在线观看视频一区二区| 1024精品合集| 欧美综合在线视频| 一区二区三区免费| 欧洲人成人精品| 天天综合色天天| 欧美妇女性影城| 蜜臀精品一区二区三区在线观看| 欧美色精品天天在线观看视频| 一区二区三区**美女毛片| 欧美亚洲精品一区| 青青草原综合久久大伊人精品优势| 欧美揉bbbbb揉bbbbb| 日韩一区精品视频| 日韩欧美一级特黄在线播放| 久久国产精品色婷婷| 国产欧美精品国产国产专区| youjizz国产精品| 亚洲成人动漫在线免费观看| 欧美一区二区三区免费视频 | 99riav久久精品riav| 一区二区三区中文字幕电影| 欧美日韩国产在线观看| 久久99国内精品| 亚洲色图.com| 欧美一区2区视频在线观看| 国产一区三区三区| 一区二区三区欧美日| 亚洲精品一区二区三区精华液| 成人99免费视频| 日韩综合小视频| 中文字幕不卡在线观看| 欧美一级黄色大片| av电影在线观看一区| 天堂蜜桃91精品| 中文字幕在线不卡视频| 欧美精品在欧美一区二区少妇| 国产另类ts人妖一区二区| 亚洲成av人片一区二区| 国产精品视频第一区| 欧美一区二区黄色| 欧美中文字幕久久| 成人夜色视频网站在线观看| 免费在线观看精品| 一区2区3区在线看| 国产精品嫩草影院av蜜臀| 精品少妇一区二区三区免费观看| 91在线视频官网| 成人国产视频在线观看| 国产麻豆精品theporn| 日韩不卡一区二区| 亚洲1区2区3区4区| 亚洲va国产天堂va久久en| 亚洲欧美日韩精品久久久久| 国产精品欧美极品| 国产精品久久久久永久免费观看| 久久精品欧美一区二区三区不卡| 日韩一区二区免费在线观看| 欧美男女性生活在线直播观看| 色88888久久久久久影院野外| 成人高清在线视频| 972aa.com艺术欧美| 色综合久久综合中文综合网| 成人精品gif动图一区| 粉嫩高潮美女一区二区三区| 成人免费视频免费观看| 9人人澡人人爽人人精品| av在线播放成人| 色成年激情久久综合| 91国在线观看| 欧美一区二区三区四区视频| 日韩精品一区二区三区在线播放| 欧美精品一区二区三区一线天视频| 日韩午夜中文字幕| 久久久www免费人成精品| 国产精品污网站| 亚洲一区二区不卡免费| 香蕉成人啪国产精品视频综合网| 日韩电影在线一区| 丰满少妇久久久久久久 | 欧美日韩国产成人在线免费| 欧美日韩精品欧美日韩精品一| 日韩一区二区三区免费看| 欧美极品另类videosde| 亚洲午夜精品网| 粉嫩aⅴ一区二区三区四区五区| 欧美三级电影精品| 亚洲国产精品黑人久久久| 亚洲一区二区三区四区不卡| 久久国产精品99久久久久久老狼| jvid福利写真一区二区三区| 欧美日韩国产bt| 亚洲女同一区二区| 国产伦精品一区二区三区视频青涩 | 国产欧美一区二区精品忘忧草| 亚洲三级在线看| 国产成人鲁色资源国产91色综 | 美女网站一区二区| 91久久线看在观草草青青| 久久婷婷色综合| 亚洲激情在线播放| 不卡的av网站| 久久精品欧美一区二区三区麻豆| 一区二区三区久久久| 99在线精品一区二区三区| 久久看人人爽人人| 国产综合一区二区| 日韩欧美国产wwwww| 男男gaygay亚洲| 日韩欧美在线不卡| 久久精品国产亚洲高清剧情介绍 | 欧美日韩免费电影| 国产精品美女久久福利网站| 激情综合网激情| 久久久噜噜噜久久中文字幕色伊伊| 午夜精品123| 日韩亚洲电影在线| 久久99热国产| 国产欧美一区二区精品性| 久久99精品久久久| 欧美韩日一区二区三区| 国产乱一区二区| 国产精品拍天天在线| 成人激情黄色小说| 中文字幕精品三区| 色综合天天综合网天天狠天天| 国产精品无码永久免费888| bt7086福利一区国产| 亚洲午夜激情网页| 日韩欧美一区二区三区在线| 国产精品一区二区久久不卡| 欧美激情一区二区三区全黄| aa级大片欧美| 日本va欧美va精品发布| 91精品国产91久久综合桃花| 黄一区二区三区| 亚洲色图视频网站| 日韩三级免费观看| 99视频有精品| 蜜臀a∨国产成人精品| 精品播放一区二区| 一本大道av伊人久久综合| 免费成人av在线播放| 国产精品久久久久久久久免费樱桃| 91麻豆免费观看| 精久久久久久久久久久| 亚洲综合在线观看视频| 91精品国产91久久综合桃花| 成人精品电影在线观看| 美女视频黄频大全不卡视频在线播放| 久久精品一区二区| 日韩一区二区高清| 色94色欧美sute亚洲13| 国产黄色91视频| 久久99久久久欧美国产| 亚洲区小说区图片区qvod| 久久久亚洲国产美女国产盗摄| av一本久道久久综合久久鬼色| 日本不卡视频一二三区| 亚洲资源在线观看| 亚洲狠狠丁香婷婷综合久久久| 国产欧美一区在线| 久久日一线二线三线suv|