Beste Arie,
Dit is een fantastisch antwoord !!
Ik heb uw c code draaiend binnen 5 minuten in c++
Een minimalistische aanpassing naar c++ gemaakt in het programma QT. Sinds kort ben ik overgestapt van QT naar CodeBlocks. Wil je QT professioneel gebruiken kost het ca 4000-5000 euro per jaar. CodeBlocks is gratis en heeft bijna dezelfde functionaliteiten alleen is er minder debug (minder uitgebreide foutmeldingen rapporten).
Dus bij moelijke zaken zet ik vaak de code op in QT, als deze dan getest is, dan hevel ik de code over naar CodeBlocks.
Zelf ben ik ca 2 jaar geleden begonnen met low level c, sinds een jaar overgestapt naar c++.
Code: Selecteer alles
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <iostream>
//this can be deactived when activated in mainwindow header file..
void calcCubicSplines();
void getSplinePoint(int i, double t/*, double *x, double *y*/);
// INPUT:
const int npoints=4; // 4 points
// matrix C [point] [dimension: 0=x, 1=y]
double C[npoints][2]={{0,0}, {10,10}, {20,9}, {15,0}};
// OUTPUT:
// solution matrix S:
// S [spline number: 0..(npoints-2)] [2 dimensions: x,y] [4 constants: a,b,c,d]
double S[npoints-1][2][4];
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
calcCubicSplines();
getSplinePoint(2,0.5);
}
// calculate all cubic spline values:
void calcCubicSplines(){
double w, b[npoints], d[npoints], x[npoints];
int i, dim;
int n = npoints-1; // number of splines
for(dim=0;dim<2;dim++){
// define d[]:
d[0]=3.0*(C[1][dim]-C[0][dim]);
for(i=1;i<n;i++)
d[i]=3.0*(C[i+1][dim]-C[i-1][dim]);
d[n]=3.0*(C[n][dim]-C[n-1][dim]);
// forward sweep: (simplified tridiagonal solution: all a[i]=1 and all c[i]=1)
b[0]=2.0;
for(i=1;i<npoints;i++){
w = 1.0/b[i-1];
b[i] = 4.0 - w;
d[i] -= (w*d[i-1]);
}
b[n] -= 2.0;
// calculate solution vector x[i] = D[i]:
// (Wikipedia x[] = Wolfram D[])
x[n]=d[n]/b[n];
for(i=n-1;i>=0;i--)
x[i]=(d[i]-x[i+1])/b[i];
// calculate spline S[i][dim] a, b, c and d:
for(i=0;i<n;i++){
S[i][dim][0]=C[i][dim];
S[i][dim][1]=x[i];
S[i][dim][2]=3.0*(C[i+1][dim]-C[i][dim]) - 2.0*x[i] - x[i+1];
S[i][dim][3]=2.0*(C[i][dim]-C[i+1][dim]) + x[i] + x[i+1];
}
}
}
// get x and y coordinates for spline i (i = 0..npoints-2) where t in interval [0, 1]:
void getSplinePoint(int i, double t/*, double *x, double *y*/){
/*(*x)*/ double x = ((S[i][0][3]*t+S[i][0][2])*t+S[i][0][1])*t+S[i][0][0];
/*(*y)*/ double y = ((S[i][1][3]*t+S[i][1][2])*t+S[i][1][1])*t+S[i][1][0];
std::cout<< "x:" << x << " y:" << y << std::endl;
}
Dit is het cad cam programma waar ik over sprak. Dit is gebouwd in Codeblocks. Het programma heeft een opengl interface.
Mijn eerste cadcam programma is geschreven in QT, had een cubic bezier spline, deze werkte dus niet goed voor
de start en eindpunten. Het programma genereerd offset contours en g_code met 1 click. Enkel de spline functie was niet correct en dat geeft gelijk problemen bijvoorbeeld voor het inladen van dxf files.
https://imgshare.io/images/2020/02/10/qt.png
Nu kan ik uw spline code implementeren (in de opengl loop zetten, koppelen aan de data array.. etc)
en verder uit testen. Dit was het laatste vraagstuk op tekengebied.
Nu is het overblijvende vraagstuk een nesting algoritme, maar dat heeft geen haast !!
Heeft u de grafiek gemaakt in matlab?
U heeft mij echt heel erg geholpen !! waarvoor veel dank. Ik kan u zeggen dat na meer dan een week proberen ik nog steeds niet verder kwam. Maar nu is het in 1 keer opgelost !!