I assume that the Antigrain adaptive subdivision cannot handle all collinear cases, or then I have made a mistake.
I ported the code to javascript and make a testbed:
http://jsbin.com/ivomiq/1
The code generates two versions of every curve: red is the reference curve, flattened using brute force method and the green is flattened using adaptive subdivision of Antigrain. They should be identical, but they are not.
There is a dataset of 256 collinear cases (there are duplicates, but all cases are covered). Of these 256 cases 8 fail, regardless of angle tolerance and approximation scale. The only way to make it work was to first split all curves in their local extremes (first derivative roots) and make then recursive subdivision to these parts. But it is rather slow to find local extremes. There must be a way to get all of collinear cases to work by modifying the code in case 0 (where all points are collinear or p1==p4. Any thoughts?
If McSeem or some other, has made a functional c++ version, could you please test the following data set and report the resulted mpoints array here.
// start of data
[10, 15, 10, 15, 10, 15, 10, 15],
[10, 20, 10, 20, 10, 20, 110, 20],
[10, 25, 10, 25, 10, 25, 210, 25],
[10, 30, 10, 30, 10, 30, 310, 30],
[10, 35, 10, 35, 110, 35, 10, 35],
[10, 40, 10, 40, 110, 40, 110, 40],
[10, 45, 10, 45, 110, 45, 210, 45],
[10, 50, 10, 50, 110, 50, 310, 50],
[10, 55, 10, 55, 210, 55, 10, 55],
[10, 60, 10, 60, 210, 60, 110, 60],
[10, 65, 10, 65, 210, 65, 210, 65],
[10, 70, 10, 70, 210, 70, 310, 70],
[10, 75, 10, 75, 310, 75, 10, 75],
[10, 80, 10, 80, 310, 80, 110, 80],
[10, 85, 10, 85, 310, 85, 210, 85],
[10, 90, 10, 90, 310, 90, 310, 90],
[10, 95, 110, 95, 10, 95, 10, 95],
[10, 100, 110, 100, 10, 100, 110, 100],
[10, 105, 110, 105, 10, 105, 210, 105],
[10, 110, 110, 110, 10, 110, 310, 110],
[10, 115, 110, 115, 110, 115, 10, 115],
[10, 120, 110, 120, 110, 120, 110, 120],
[10, 125, 110, 125, 110, 125, 210, 125],
[10, 130, 110, 130, 110, 130, 310, 130],
[10, 135, 110, 135, 210, 135, 10, 135],
[10, 140, 110, 140, 210, 140, 110, 140],
[10, 145, 110, 145, 210, 145, 210, 145],
[10, 150, 110, 150, 210, 150, 310, 150],
[10, 155, 110, 155, 310, 155, 10, 155],
[10, 160, 110, 160, 310, 160, 110, 160],
[10, 165, 110, 165, 310, 165, 210, 165],
[10, 170, 110, 170, 310, 170, 310, 170],
[10, 175, 210, 175, 10, 175, 10, 175],
[10, 180, 210, 180, 10, 180, 110, 180],
[10, 185, 210, 185, 10, 185, 210, 185],
[10, 190, 210, 190, 10, 190, 310, 190],
[10, 195, 210, 195, 110, 195, 10, 195],
[10, 200, 210, 200, 110, 200, 110, 200],
[10, 205, 210, 205, 110, 205, 210, 205],
[10, 210, 210, 210, 110, 210, 310, 210],
[10, 215, 210, 215, 210, 215, 10, 215],
[10, 220, 210, 220, 210, 220, 110, 220],
[10, 225, 210, 225, 210, 225, 210, 225],
[10, 230, 210, 230, 210, 230, 310, 230],
[10, 235, 210, 235, 310, 235, 10, 235],
[10, 240, 210, 240, 310, 240, 110, 240],
[10, 245, 210, 245, 310, 245, 210, 245],
[10, 250, 210, 250, 310, 250, 310, 250],
[10, 255, 310, 255, 10, 255, 10, 255],
[10, 260, 310, 260, 10, 260, 110, 260],
[10, 265, 310, 265, 10, 265, 210, 265],
[10, 270, 310, 270, 10, 270, 310, 270],
[10, 275, 310, 275, 110, 275, 10, 275],
[10, 280, 310, 280, 110, 280, 110, 280],
[10, 285, 310, 285, 110, 285, 210, 285],
[10, 290, 310, 290, 110, 290, 310, 290],
[10, 295, 310, 295, 210, 295, 10, 295],
[10, 300, 310, 300, 210, 300, 110, 300],
[10, 305, 310, 305, 210, 305, 210, 305],
[10, 310, 310, 310, 210, 310, 310, 310],
[10, 315, 310, 315, 310, 315, 10, 315],
[10, 320, 310, 320, 310, 320, 110, 320],
[10, 325, 310, 325, 310, 325, 210, 325],
[10, 330, 310, 330, 310, 330, 310, 330],
[110, 335, 10, 335, 10, 335, 10, 335],
[110, 340, 10, 340, 10, 340, 110, 340],
[110, 345, 10, 345, 10, 345, 210, 345],
[110, 350, 10, 350, 10, 350, 310, 350],
[110, 355, 10, 355, 110, 355, 10, 355],
[110, 360, 10, 360, 110, 360, 110, 360],
[110, 365, 10, 365, 110, 365, 210, 365],
[110, 370, 10, 370, 110, 370, 310, 370],
[110, 375, 10, 375, 210, 375, 10, 375],
[110, 380, 10, 380, 210, 380, 110, 380],
[110, 385, 10, 385, 210, 385, 210, 385],
[110, 390, 10, 390, 210, 390, 310, 390],
[110, 395, 10, 395, 310, 395, 10, 395],
[110, 400, 10, 400, 310, 400, 110, 400],
[110, 405, 10, 405, 310, 405, 210, 405],
[110, 410, 10, 410, 310, 410, 310, 410],
[110, 415, 110, 415, 10, 415, 10, 415],
[110, 420, 110, 420, 10, 420, 110, 420],
[110, 425, 110, 425, 10, 425, 210, 425],
[110, 430, 110, 430, 10, 430, 310, 430],
[110, 435, 110, 435, 110, 435, 10, 435],
[110, 440, 110, 440, 110, 440, 110, 440],
[110, 445, 110, 445, 110, 445, 210, 445],
[110, 450, 110, 450, 110, 450, 310, 450],
[110, 455, 110, 455, 210, 455, 10, 455],
[110, 460, 110, 460, 210, 460, 110, 460],
[110, 465, 110, 465, 210, 465, 210, 465],
[110, 470, 110, 470, 210, 470, 310, 470],
[110, 475, 110, 475, 310, 475, 10, 475],
[110, 480, 110, 480, 310, 480, 110, 480],
[110, 485, 110, 485, 310, 485, 210, 485],
[110, 490, 110, 490, 310, 490, 310, 490],
[110, 495, 210, 495, 10, 495, 10, 495],
[110, 500, 210, 500, 10, 500, 110, 500],
[110, 505, 210, 505, 10, 505, 210, 505],
[110, 510, 210, 510, 10, 510, 310, 510],
[110, 515, 210, 515, 110, 515, 10, 515],
[110, 520, 210, 520, 110, 520, 110, 520],
[110, 525, 210, 525, 110, 525, 210, 525],
[110, 530, 210, 530, 110, 530, 310, 530],
[110, 535, 210, 535, 210, 535, 10, 535],
[110, 540, 210, 540, 210, 540, 110, 540],
[110, 545, 210, 545, 210, 545, 210, 545],
[110, 550, 210, 550, 210, 550, 310, 550],
[110, 555, 210, 555, 310, 555, 10, 555],
[110, 560, 210, 560, 310, 560, 110, 560],
[110, 565, 210, 565, 310, 565, 210, 565],
[110, 570, 210, 570, 310, 570, 310, 570],
[110, 575, 310, 575, 10, 575, 10, 575],
[110, 580, 310, 580, 10, 580, 110, 580],
[110, 585, 310, 585, 10, 585, 210, 585],
[110, 590, 310, 590, 10, 590, 310, 590],
[110, 595, 310, 595, 110, 595, 10, 595],
[110, 600, 310, 600, 110, 600, 110, 600],
[110, 605, 310, 605, 110, 605, 210, 605],
[110, 610, 310, 610, 110, 610, 310, 610],
[110, 615, 310, 615, 210, 615, 10, 615],
[110, 620, 310, 620, 210, 620, 110, 620],
[110, 625, 310, 625, 210, 625, 210, 625],
[110, 630, 310, 630, 210, 630, 310, 630],
[110, 635, 310, 635, 310, 635, 10, 635],
[110, 640, 310, 640, 310, 640, 110, 640],
[110, 645, 310, 645, 310, 645, 210, 645],
[110, 650, 310, 650, 310, 650, 310, 650],
[210, 655, 10, 655, 10, 655, 10, 655],
[210, 660, 10, 660, 10, 660, 110, 660],
[210, 665, 10, 665, 10, 665, 210, 665],
[210, 670, 10, 670, 10, 670, 310, 670],
[210, 675, 10, 675, 110, 675, 10, 675],
[210, 680, 10, 680, 110, 680, 110, 680],
[210, 685, 10, 685, 110, 685, 210, 685],
[210, 690, 10, 690, 110, 690, 310, 690],
[210, 695, 10, 695, 210, 695, 10, 695],
[210, 700, 10, 700, 210, 700, 110, 700],
[210, 705, 10, 705, 210, 705, 210, 705],
[210, 710, 10, 710, 210, 710, 310, 710],
[210, 715, 10, 715, 310, 715, 10, 715],
[210, 720, 10, 720, 310, 720, 110, 720],
[210, 725, 10, 725, 310, 725, 210, 725],
[210, 730, 10, 730, 310, 730, 310, 730],
[210, 735, 110, 735, 10, 735, 10, 735],
[210, 740, 110, 740, 10, 740, 110, 740],
[210, 745, 110, 745, 10, 745, 210, 745],
[210, 750, 110, 750, 10, 750, 310, 750],
[210, 755, 110, 755, 110, 755, 10, 755],
[210, 760, 110, 760, 110, 760, 110, 760],
[210, 765, 110, 765, 110, 765, 210, 765],
[210, 770, 110, 770, 110, 770, 310, 770],
[210, 775, 110, 775, 210, 775, 10, 775],
[210, 780, 110, 780, 210, 780, 110, 780],
[210, 785, 110, 785, 210, 785, 210, 785],
[210, 790, 110, 790, 210, 790, 310, 790],
[210, 795, 110, 795, 310, 795, 10, 795],
[210, 800, 110, 800, 310, 800, 110, 800],
[210, 805, 110, 805, 310, 805, 210, 805],
[210, 810, 110, 810, 310, 810, 310, 810],
[210, 815, 210, 815, 10, 815, 10, 815],
[210, 820, 210, 820, 10, 820, 110, 820],
[210, 825, 210, 825, 10, 825, 210, 825],
[210, 830, 210, 830, 10, 830, 310, 830],
[210, 835, 210, 835, 110, 835, 10, 835],
[210, 840, 210, 840, 110, 840, 110, 840],
[210, 845, 210, 845, 110, 845, 210, 845],
[210, 850, 210, 850, 110, 850, 310, 850],
[210, 855, 210, 855, 210, 855, 10, 855],
[210, 860, 210, 860, 210, 860, 110, 860],
[210, 865, 210, 865, 210, 865, 210, 865],
[210, 870, 210, 870, 210, 870, 310, 870],
[210, 875, 210, 875, 310, 875, 10, 875],
[210, 880, 210, 880, 310, 880, 110, 880],
[210, 885, 210, 885, 310, 885, 210, 885],
[210, 890, 210, 890, 310, 890, 310, 890],
[210, 895, 310, 895, 10, 895, 10, 895],
[210, 900, 310, 900, 10, 900, 110, 900],
[210, 905, 310, 905, 10, 905, 210, 905],
[210, 910, 310, 910, 10, 910, 310, 910],
[210, 915, 310, 915, 110, 915, 10, 915],
[210, 920, 310, 920, 110, 920, 110, 920],
[210, 925, 310, 925, 110, 925, 210, 925],
[210, 930, 310, 930, 110, 930, 310, 930],
[210, 935, 310, 935, 210, 935, 10, 935],
[210, 940, 310, 940, 210, 940, 110, 940],
[210, 945, 310, 945, 210, 945, 210, 945],
[210, 950, 310, 950, 210, 950, 310, 950],
[210, 955, 310, 955, 310, 955, 10, 955],
[210, 960, 310, 960, 310, 960, 110, 960],
[210, 965, 310, 965, 310, 965, 210, 965],
[210, 970, 310, 970, 310, 970, 310, 970],
[310, 975, 10, 975, 10, 975, 10, 975],
[310, 980, 10, 980, 10, 980, 110, 980],
[310, 985, 10, 985, 10, 985, 210, 985],
[310, 990, 10, 990, 10, 990, 310, 990],
[310, 995, 10, 995, 110, 995, 10, 995],
[310, 1000, 10, 1000, 110, 1000, 110, 1000],
[310, 1005, 10, 1005, 110, 1005, 210, 1005],
[310, 1010, 10, 1010, 110, 1010, 310, 1010],
[310, 1015, 10, 1015, 210, 1015, 10, 1015],
[310, 1020, 10, 1020, 210, 1020, 110, 1020],
[310, 1025, 10, 1025, 210, 1025, 210, 1025],
[310, 1030, 10, 1030, 210, 1030, 310, 1030],
[310, 1035, 10, 1035, 310, 1035, 10, 1035],
[310, 1040, 10, 1040, 310, 1040, 110, 1040],
[310, 1045, 10, 1045, 310, 1045, 210, 1045],
[310, 1050, 10, 1050, 310, 1050, 310, 1050],
[310, 1055, 110, 1055, 10, 1055, 10, 1055],
[310, 1060, 110, 1060, 10, 1060, 110, 1060],
[310, 1065, 110, 1065, 10, 1065, 210, 1065],
[310, 1070, 110, 1070, 10, 1070, 310, 1070],
[310, 1075, 110, 1075, 110, 1075, 10, 1075],
[310, 1080, 110, 1080, 110, 1080, 110, 1080],
[310, 1085, 110, 1085, 110, 1085, 210, 1085],
[310, 1090, 110, 1090, 110, 1090, 310, 1090],
[310, 1095, 110, 1095, 210, 1095, 10, 1095],
[310, 1100, 110, 1100, 210, 1100, 110, 1100],
[310, 1105, 110, 1105, 210, 1105, 210, 1105],
[310, 1110, 110, 1110, 210, 1110, 310, 1110],
[310, 1115, 110, 1115, 310, 1115, 10, 1115],
[310, 1120, 110, 1120, 310, 1120, 110, 1120],
[310, 1125, 110, 1125, 310, 1125, 210, 1125],
[310, 1130, 110, 1130, 310, 1130, 310, 1130],
[310, 1135, 210, 1135, 10, 1135, 10, 1135],
[310, 1140, 210, 1140, 10, 1140, 110, 1140],
[310, 1145, 210, 1145, 10, 1145, 210, 1145],
[310, 1150, 210, 1150, 10, 1150, 310, 1150],
[310, 1155, 210, 1155, 110, 1155, 10, 1155],
[310, 1160, 210, 1160, 110, 1160, 110, 1160],
[310, 1165, 210, 1165, 110, 1165, 210, 1165],
[310, 1170, 210, 1170, 110, 1170, 310, 1170],
[310, 1175, 210, 1175, 210, 1175, 10, 1175],
[310, 1180, 210, 1180, 210, 1180, 110, 1180],
[310, 1185, 210, 1185, 210, 1185, 210, 1185],
[310, 1190, 210, 1190, 210, 1190, 310, 1190],
[310, 1195, 210, 1195, 310, 1195, 10, 1195],
[310, 1200, 210, 1200, 310, 1200, 110, 1200],
[310, 1205, 210, 1205, 310, 1205, 210, 1205],
[310, 1210, 210, 1210, 310, 1210, 310, 1210],
[310, 1215, 310, 1215, 10, 1215, 10, 1215],
[310, 1220, 310, 1220, 10, 1220, 110, 1220],
[310, 1225, 310, 1225, 10, 1225, 210, 1225],
[310, 1230, 310, 1230, 10, 1230, 310, 1230],
[310, 1235, 310, 1235, 110, 1235, 10, 1235],
[310, 1240, 310, 1240, 110, 1240, 110, 1240],
[310, 1245, 310, 1245, 110, 1245, 210, 1245],
[310, 1250, 310, 1250, 110, 1250, 310, 1250],
[310, 1255, 310, 1255, 210, 1255, 10, 1255],
[310, 1260, 310, 1260, 210, 1260, 110, 1260],
[310, 1265, 310, 1265, 210, 1265, 210, 1265],
[310, 1270, 310, 1270, 210, 1270, 310, 1270],
[310, 1275, 310, 1275, 310, 1275, 10, 1275],
[310, 1280, 310, 1280, 310, 1280, 110, 1280],
[310, 1285, 310, 1285, 310, 1285, 210, 1285],
[310, 1290, 310, 1290, 310, 1290, 310, 1290]
// end of data