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

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

?? merge.c

?? 關于網格剖分的
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*<html><pre>  -<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="TOP">-</a>

   merge.c 
   merges non-convex facets

   see qh-c.htm and merge.h

   other modules call qh_premerge() and qh_postmerge()

   the user may call qh_postmerge() to perform additional merges.

   To remove deleted facets and vertices (qhull() in qhull.c):
     qh_partitionvisible (!qh_ALL, &numoutside);  // visible_list, newfacet_list
     qh_deletevisible ();         // qh.visible_list
     qh_resetlists (False);       // qh.visible_list newvertex_list newfacet_list 

   assumes qh.CENTERtype= centrum

   merges occur in qh_mergefacet and in qh_mergecycle
   vertex->neighbors not set until the first merge occurs

   copyright (c) 1993-1999 The Geometry Center        
*/

#include "qhull_a.h"

#ifndef qh_NOmerge

/*=========== internal prototypes =========*/

static int qh_compareangle(const void *p1, const void *p2);
static int qh_comparemerge(const void *p1, const void *p2);
static int qh_comparevisit (const void *p1, const void *p2);

																														
/*===== functions (alphabetical after premerge and postmerge) ======*/

/*-<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="premerge">-</a>
  
  qh_premerge( apex, maxcentrum )
    pre-merge nonconvex facets in qh.newfacet_list for apex
    maxcentrum defines coplanar and concave (qh_test_appendmerge)

  returns:
    deleted facets added to qh.visible_list with facet->visible set

  notes:
    uses globals, qh.MERGEexact, qh.PREmerge

  design:
    mark duplicate ridges in qh.newfacet_list
    merge facet cycles in qh.newfacet_list
    merge duplicate ridges and concave facets in qh.newfacet_list
    check merged facet cycles for degenerate and redundant facets
    merge degenerate and redundant facets
    collect coplanar and concave facets
    merge concave, coplanar, degenerate, and redundant facets
*/
void qh_premerge (vertexT *apex, realT maxcentrum, realT maxangle) {
  boolT othermerge= False;
  facetT *newfacet;
  
  if (qh ZEROcentrum && qh_checkzero(!qh_ALL))
    return;    
  trace2((qh ferr, "qh_premerge: premerge centrum %2.2g angle %2.2g for apex v%d facetlist f%d\n",
	    maxcentrum, maxangle, apex->id, getid_(qh newfacet_list)));
  if (qh IStracing >= 4 && qh num_facets < 50)
    qh_printlists();
  qh centrum_radius= maxcentrum;
  qh cos_max= maxangle;
  qh degen_mergeset= qh_settemp (qh TEMPsize);
  qh facet_mergeset= qh_settemp (qh TEMPsize);
  if (qh hull_dim >=3) { 
    qh_mark_dupridges (qh newfacet_list); /* facet_mergeset */
    qh_mergecycle_all (qh newfacet_list, &othermerge);
    qh_forcedmerges (&othermerge /* qh facet_mergeset */); 
    FORALLnew_facets {  /* test samecycle merges */
      if (!newfacet->simplicial && !newfacet->mergeridge)
	qh_degen_redundant_neighbors (newfacet, NULL);
    }
    if (qh_merge_degenredundant())
      othermerge= True;
  }else /* qh hull_dim == 2 */
    qh_mergecycle_all (qh newfacet_list, &othermerge);
  qh_flippedmerges (qh newfacet_list, &othermerge);
  if (!qh MERGEexact || zzval_(Ztotmerge)) {
    zinc_(Zpremergetot);
    qh POSTmerging= False;
    qh_getmergeset_initial (qh newfacet_list);
    qh_all_merges (othermerge, False);
  }
  qh_settempfree(&qh facet_mergeset);
  qh_settempfree(&qh degen_mergeset);
} /* premerge */
  
/*-<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="postmerge">-</a>
  
  qh_postmerge( reason, maxcentrum, maxangle, vneighbors )
    post-merge nonconvex facets as defined by maxcentrum and maxangle
    'reason' is for reporting progress
    if vneighbors, 
      calls qh_test_vneighbors at end of qh_all_merge 
    if firstmerge, 
      calls qh_reducevertices before qh_getmergeset

  returns:
    if first call (qh.visible_list != qh.facet_list), 
      builds qh.facet_newlist, qh.newvertex_list
    deleted facets added to qh.visible_list with facet->visible
    qh.visible_list == qh.facet_list

  notes:


  design:
    if first call
      set qh.visible_list and qh.newfacet_list to qh.facet_list
      add all facets to qh.newfacet_list
      mark non-simplicial facets, facet->newmerge
      set qh.newvertext_list to qh.vertex_list
      add all vertices to qh.newvertex_list
      if a pre-merge occured
        set vertex->delridge {will retest the ridge}
        if qh.MERGEexact
          call qh_reducevertices()
      if no pre-merging 
        merge flipped facets
    determine non-convex facets
    merge all non-convex facets
*/
void qh_postmerge (char *reason, realT maxcentrum, realT maxangle, 
                      boolT vneighbors) {
  facetT *newfacet;
  boolT othermerges= False;
  vertexT *vertex;

  if (qh REPORTfreq || qh IStracing) {
    qh_buildtracing (NULL, NULL);
    qh_printsummary (qh ferr);
    if (qh PRINTstatistics) 
      qh_printallstatistics (qh ferr, "reason");
    fprintf (qh ferr, "\n%s with 'C%.2g' and 'A%.2g'\n", 
        reason, maxcentrum, maxangle);
  }
  trace2((qh ferr, "qh_postmerge: postmerge.  test vneighbors? %d\n",
	    vneighbors));
  qh centrum_radius= maxcentrum;
  qh cos_max= maxangle;
  qh POSTmerging= True;
  qh degen_mergeset= qh_settemp (qh TEMPsize);
  qh facet_mergeset= qh_settemp (qh TEMPsize);
  if (qh visible_list != qh facet_list) {  /* first call */
    qh NEWfacets= True;
    qh visible_list= qh newfacet_list= qh facet_list;
    FORALLnew_facets {
      newfacet->newfacet= True;
       if (!newfacet->simplicial)
        newfacet->newmerge= True;
     zinc_(Zpostfacets);
    }
    qh newvertex_list= qh vertex_list;
    FORALLvertices
      vertex->newlist= True;
    if (qh VERTEXneighbors) { /* a merge has occurred */
      FORALLvertices
	vertex->delridge= True; /* test for redundant, needed? */
      if (qh MERGEexact) {
	if (qh hull_dim <= qh_DIMreduceBuild)
	  qh_reducevertices(); /* was skipped during pre-merging */
      }
    }
    if (!qh PREmerge && !qh MERGEexact) 
      qh_flippedmerges (qh newfacet_list, &othermerges);
  }
  qh_getmergeset_initial (qh newfacet_list);
  qh_all_merges (False, vneighbors);
  qh_settempfree(&qh facet_mergeset);
  qh_settempfree(&qh degen_mergeset);
} /* post_merge */

/*-<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="all_merges">-</a>
  
  qh_all_merges( othermerge, vneighbors )
    merge all non-convex facets
    
    set othermerge if already merged facets (for qh_reducevertices)
    if vneighbors
      tests vertex neighbors for convexity at end
    qh.facet_mergeset lists the non-convex ridges in qh_newfacet_list
    qh.degen_mergeset is defined
    if qh.MERGEexact && !qh.POSTmerging, 
      does not merge coplanar facets

  returns:
    deleted facets added to qh.visible_list with facet->visible
    deleted vertices added qh.delvertex_list with vertex->delvertex
  
  notes:
    unless !qh.MERGEindependent, 
      merges facets in independent sets
    uses qh.newfacet_list as argument since merges call qh_removefacet()

  design:
    while merges occur
      for each merge in qh.facet_mergeset
        unless one of the facets was already merged in this pass
          merge the facets
        test merged facets for additional merges
        add merges to qh.facet_mergeset
      if vertices record neighboring facets
        rename redundant vertices
          update qh.facet_mergeset
    if vneighbors ??
      tests vertex neighbors for convexity at end
*/
void qh_all_merges (boolT othermerge, boolT vneighbors) {
  facetT *facet1, *facet2;
  mergeT *merge;
  boolT wasmerge= True, isreduce;
  void **freelistp;  /* used !qh_NOmem */
  vertexT *vertex;
  mergeType mergetype;
  int numcoplanar=0, numconcave=0, numdegenredun= 0, numnewmerges= 0;
  
  trace2((qh ferr, "qh_all_merges: starting to merge facets beginning from f%d\n",
	    getid_(qh newfacet_list)));
  while (True) {
    wasmerge= False;
    while (qh_setsize (qh facet_mergeset)) {
      while ((merge= (mergeT*)qh_setdellast(qh facet_mergeset))) {
	facet1= merge->facet1;
	facet2= merge->facet2;
	mergetype= merge->type;
	qh_memfree_(merge, sizeof(mergeT), freelistp);
	if (facet1->visible || facet2->visible) /*deleted facet*/
	  continue;  
	if ((facet1->newfacet && !facet1->tested)
	        || (facet2->newfacet && !facet2->tested)) {
	  if (qh MERGEindependent && mergetype <= MRGanglecoplanar)
	    continue;      /* perform independent sets of merges */
	}
	qh_merge_nonconvex (facet1, facet2, mergetype);
        numdegenredun += qh_merge_degenredundant();
        numnewmerges++;
        wasmerge= True;
	if (mergetype == MRGconcave)
	  numconcave++;
	else /* MRGcoplanar or MRGanglecoplanar */
	  numcoplanar++;
      } /* while setdellast */
      if (qh POSTmerging && qh hull_dim <= qh_DIMreduceBuild 
      && numnewmerges > qh_MAXnewmerges) {
	numnewmerges= 0;
	qh_reducevertices();  /* otherwise large post merges too slow */
      }
      qh_getmergeset (qh newfacet_list); /* facet_mergeset */
    } /* while mergeset */
    if (qh VERTEXneighbors) {
      isreduce= False;
      if (qh hull_dim >=4 && qh POSTmerging) {
	FORALLvertices  
	  vertex->delridge= True;
	isreduce= True;
      }
      if ((wasmerge || othermerge) && (!qh MERGEexact || qh POSTmerging) 
	  && qh hull_dim <= qh_DIMreduceBuild) {
	othermerge= False;
	isreduce= True;
      }
      if (isreduce) {
	if (qh_reducevertices()) {
	  qh_getmergeset (qh newfacet_list); /* facet_mergeset */
	  continue;
	}
      }
    }
    if (vneighbors && qh_test_vneighbors(/* qh newfacet_list */)) 
      continue;
    break;
  } /* while (True) */
  if (qh CHECKfrequently && !qh MERGEexact) {
    qh old_randomdist= qh RANDOMdist;
    qh RANDOMdist= False;
    qh_checkconvex (qh newfacet_list, qh_ALGORITHMfault);
    /* qh_checkconnect (); [this is slow and it changes the facet order] */
    qh RANDOMdist= qh old_randomdist;
  }
  trace1((qh ferr, "qh_all_merges: merged %d coplanar facets %d concave facets and %d degen or redundant facets.\n",
    numcoplanar, numconcave, numdegenredun));
  if (qh IStracing >= 4 && qh num_facets < 50)
    qh_printlists ();
} /* all_merges */


/*-<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="appendmergeset">-</a>
  
  qh_appendmergeset( facet, neighbor, mergetype, angle )
    appends an entry to qh.facet_mergeset or qh.degen_mergeset

    angle ignored if NULL or !qh.ANGLEmerge

  returns:
    merge appended to facet_mergeset or degen_mergeset
      sets ->degenerate or ->redundant if degen_mergeset
  
  see:
    qh_test_appendmerge()

  design:
    allocate merge entry
    if regular merge
      append to qh.facet_mergeset
    else if degenerate merge and qh.facet_mergeset is all degenerate
      append to qh.degen_mergeset 
    else if degenerate merge
      prepend to qh.degen_mergeset 
    else if redundant merge
      append to qh.degen_mergeset 
*/
void qh_appendmergeset(facetT *facet, facetT *neighbor, mergeType mergetype, realT *angle) {
  mergeT *merge, *lastmerge;
  void **freelistp; /* used !qh_NOmem */

  if (facet->redundant)
    return;
  if (facet->degenerate && mergetype == MRGdegen)
    return;
  qh_memalloc_(sizeof(mergeT), freelistp, merge, mergeT);
  merge->facet1= facet;
  merge->facet2= neighbor;
  merge->type= mergetype;
  if (angle && qh ANGLEmerge)
    merge->angle= *angle;
  if (mergetype < MRGdegen)
    qh_setappend (&(qh facet_mergeset), merge);
  else if (mergetype == MRGdegen) {
    facet->degenerate= True;
    if (!(lastmerge= (mergeT*)qh_setlast (qh degen_mergeset)) 
    || lastmerge->type == MRGdegen)
      qh_setappend (&(qh degen_mergeset), merge);
    else
      qh_setaddnth (&(qh degen_mergeset), 0, merge);
  }else { /* mergetype == MRGredundant */
    facet->redundant= True;
    qh_setappend (&(qh degen_mergeset), merge);
  }
} /* appendmergeset */


/*-<a                             href="qh-c.htm#merge"
  >-------------------------------</a><a name="basevertices">-</a>
  
  qh_basevertices( samecycle )
    return temporary set of base vertices for samecycle
    samecycle is first facet in the cycle
    assumes apex is SETfirst_( samecycle->vertices )

  returns:
    vertices (settemp)
    all ->seen are cleared

  notes:
    uses qh_vertex_visit;

  design:
    for each facet in samecycle
      for each unseen vertex in facet->vertices
        append to result  
*/
setT *qh_basevertices (facetT *samecycle) {
  facetT *same;
  vertexT *apex, *vertex, **vertexp;
  setT *vertices= qh_settemp (qh TEMPsize);
  
  apex= SETfirstt_(samecycle->vertices, vertexT);
  apex->visitid= ++qh vertex_visit;
  FORALLsame_cycle_(samecycle) {
    if (same->mergeridge)
      continue;
    FOREACHvertex_(same->vertices) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品在线一区二区| 欧美色倩网站大全免费| 欧美精品三级在线观看| 国产精品久久久久一区二区三区| 亚洲超丰满肉感bbw| 成年人国产精品| 日韩欧美国产wwwww| 亚洲国产日韩a在线播放性色| 国产成人福利片| 日韩视频在线永久播放| 一区二区三区四区av| 成人av网站免费| 精品国产免费一区二区三区香蕉| 亚洲不卡在线观看| 91福利小视频| 亚洲欧美乱综合| 国产一区在线看| 欧美哺乳videos| 美女免费视频一区| 欧美日本一区二区三区| 一区二区三区欧美久久| 99视频有精品| 国产精品成人免费精品自在线观看| 韩国三级电影一区二区| 日韩丝袜美女视频| 日本sm残虐另类| 欧美日韩成人综合天天影院 | 日本黄色一区二区| 成人免费视频在线观看| 成人av免费在线观看| 国产欧美精品一区二区三区四区| 国产一区二区三区观看| 欧美www视频| 精品一区二区三区在线播放视频| 日韩欧美一二区| 开心九九激情九九欧美日韩精美视频电影 | 日本视频中文字幕一区二区三区| 欧美蜜桃一区二区三区| 香蕉久久夜色精品国产使用方法 | 欧美日韩国产成人在线免费| 亚洲在线视频一区| 在线观看视频欧美| 一区二区三区色| 欧美日韩大陆一区二区| 日韩激情中文字幕| 日韩一区二区三区视频| 免费成人av在线| 精品国产乱码久久久久久免费| 捆绑调教一区二区三区| 久久久美女毛片| 成人免费视频国产在线观看| 国产精品超碰97尤物18| 日本道色综合久久| 亚洲大尺度视频在线观看| 欧美一区二区三区在线观看| 麻豆精品视频在线| 国产欧美在线观看一区| 99精品欧美一区二区蜜桃免费| 最新欧美精品一区二区三区| 欧洲激情一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎| 日韩免费看网站| 国产福利91精品一区| 中文字幕在线一区| 欧美中文字幕一区二区三区亚洲| 日韩精品一二三四| 精品粉嫩aⅴ一区二区三区四区| 国产高清成人在线| 亚洲视频你懂的| 欧美精品一级二级三级| 精久久久久久久久久久| 中文字幕精品综合| 色婷婷久久99综合精品jk白丝| 亚洲成a人在线观看| 精品国产乱子伦一区| 成人av在线一区二区三区| 一区二区欧美国产| 日韩精品在线网站| 成年人国产精品| 日韩av一级电影| 国产精品另类一区| 911精品国产一区二区在线| 国内精品免费**视频| 亚洲美女偷拍久久| 欧美大片日本大片免费观看| 成人中文字幕电影| 日韩国产成人精品| 国产精品麻豆久久久| 制服丝袜国产精品| 成人免费毛片片v| 天堂精品中文字幕在线| 国产欧美日韩亚州综合| 欧美日本不卡视频| 岛国av在线一区| 日韩成人av影视| 中文字幕一区二区三区视频| 欧美一区二区三区喷汁尤物| av一区二区三区黑人| 另类成人小视频在线| 亚洲免费观看高清完整 | 不卡av在线网| 日本不卡1234视频| 亚洲欧美国产三级| 国产视频在线观看一区二区三区| 欧美日韩美女一区二区| 成人国产亚洲欧美成人综合网| 热久久久久久久| 亚洲一区二区视频在线| 中文字幕高清不卡| 精品久久人人做人人爽| 欧洲人成人精品| 粉嫩av一区二区三区在线播放| 亚洲国产精品综合小说图片区| 久久综合五月天婷婷伊人| 欧美色图免费看| 97se亚洲国产综合自在线不卡| 肉色丝袜一区二区| 亚洲激情在线激情| 久久久久久一二三区| 3d动漫精品啪啪| 91农村精品一区二区在线| 国产毛片精品国产一区二区三区| 久久综合色天天久久综合图片| 欧美乱妇20p| 国产激情视频一区二区在线观看| 亚洲午夜精品在线| 亚洲男人天堂av网| 久久影院午夜片一区| 欧美不卡一二三| 91久久精品一区二区三区| 成人午夜又粗又硬又大| 理论电影国产精品| 亚洲成人激情自拍| 亚洲男人的天堂在线观看| 国产精品欧美久久久久一区二区| 日韩欧美中文一区| 欧美视频一区二区| 欧美影视一区二区三区| 高清免费成人av| 国产超碰在线一区| 激情久久久久久久久久久久久久久久| 天天影视涩香欲综合网| 亚洲男人天堂av| 亚洲蜜臀av乱码久久精品| 亚洲天堂a在线| 国产欧美日韩亚州综合| 国产午夜三级一区二区三| 欧美大胆人体bbbb| 日韩午夜电影在线观看| 欧美裸体bbwbbwbbw| 欧美电影在线免费观看| 成人午夜激情影院| 成人黄色av电影| www.在线成人| 成人的网站免费观看| www.性欧美| 成人毛片老司机大片| 99re热视频精品| 91视频一区二区| av亚洲精华国产精华| 99re这里只有精品首页| 99视频超级精品| 在线观看国产91| 色老头久久综合| 欧美日韩不卡一区二区| 欧美久久久影院| 欧美一卡二卡在线观看| 欧美mv和日韩mv的网站| 精品免费日韩av| 久久精子c满五个校花| 精品福利在线导航| 中文字幕不卡在线观看| 国产欧美日韩综合精品一区二区| 国产精品免费aⅴ片在线观看| 亚洲视频在线一区二区| 亚洲人成网站色在线观看| 亚洲一区在线视频观看| 亚洲一本大道在线| 日本欧美一区二区| 久88久久88久久久| 成人av在线资源| 欧美午夜一区二区| 欧美一区二区三区思思人| 日韩欧美资源站| 久久综合九色综合欧美就去吻| 国产午夜亚洲精品午夜鲁丝片| 中文字幕欧美三区| 国产午夜一区二区三区| **网站欧美大片在线观看| 亚洲v日本v欧美v久久精品| 日韩国产成人精品| 顶级嫩模精品视频在线看| 在线视频亚洲一区| 91麻豆精品国产综合久久久久久| 久久精品人人做人人爽人人| 中文字幕一区日韩精品欧美| 天堂精品中文字幕在线| 另类专区欧美蜜桃臀第一页| 国产成人免费视频网站高清观看视频 | 欧美三级资源在线|