void compute_deltas(pmt_t* ppi, int x, int ix, int iy, int y, int* deltas) { int i; int in_same_cycle; point_t* px = &ppi->points[x]; point_t* pix = &ppi->points[ix]; point_t* piiy = &ppi->points[iy]; point_t* py = &ppi->points[y]; for (i = 1; i <= ppi->N; i++) deltas[i] = 0; // In the same cycle, but neighbors. if (pix == py) { // No change. printf("-- delta case 1.\n"); } // In different cycles, but one of x and iy is in a one-cycle. else if (px == pix) { int ycyclen = get_cycle_length(ppi, y); printf("-- delta case 2.\n"); deltas[1]--; deltas[ycyclen]--; deltas[ycyclen+1]++; } else if (piiy == py) { int xcyclen = get_cycle_length(ppi, x); printf("-- delta case 3.\n"); deltas[1]--; deltas[xcyclen]--; deltas[xcyclen+1]++; } // In the same cycle, but neighbors. else if (pix == piiy) { int xcyclen = get_cycle_length(ppi, x); printf("-- delta case 4.\n"); deltas[xcyclen]--; deltas[xcyclen-1]++; deltas[1]++; } else if (px == py) { int ycyclen = get_cycle_length(ppi, y); printf("-- delta case 5.\n"); deltas[ycyclen]--; deltas[ycyclen-1]++; deltas[1]++; } else { int xcyclen, ycyclen, dxy, dyx; in_same_cycle = are_in_same_cycle(ppi, x, y, &xcyclen, &ycyclen, &dxy, &dyx); if (in_same_cycle) { // It splits into separate cycles. printf("-- delta case 6.\n"); printf("-- same: d(%d,%d)=%d d(%d,%d)=%d\n", x,y, dxy, y,x,dyx); deltas[dxy+dyx]--; deltas[dxy-1]++; deltas[dyx+1]++; } else { // They merge into a common cycle. printf("-- delta case 7.\n"); printf("-- diff: len(%d)=%d len(%d)=%d\n", x,xcyclen, y,ycyclen); deltas[xcyclen]--; deltas[ycyclen]--; deltas[xcyclen+ycyclen]++; } } }