Avatar billede monie Nybegynder
19. april 2004 - 20:02 Der er 27 kommentarer og
1 løsning

Målfast udprintning af vingeprofil

Har lave et program der beregner vindmøllevinger af NACA vingeprofil typer.
Men det er meget lang tid side der er arbejdet på dette, så jeg kan ikke helt overskue problemet.

Se billede af vingeprofilet:
www.sunwind.dk/vingeprofil.jpg

Problemformulering:

Når jeg så efter udprintning måler på (papiret) vingeprofilet, så måles der 152 mm
hvor programmet siger 134,4 mm.
Denne forskel har du en løsning på dette?
Resultatet skulle efter udprintning gerne være 134,4 mm.

Program koderne:

  type
    TVingePkt = record
    x:  Real;
    y:  Real;
  end;
  TVingeKoord = record
    Pkt1: TVingePkt;
    Pkt2: TVingePkt;
  end;

  TfrmProfil = class(TForm)
    btnExit: TButton;
    Image1: TImage;
    btnTegn: TButton;
    seZoom: TSpinEdit;
    btnGemJpeg: TButton;
    PrintDialog1: TPrintDialog;
    Label1: TLabel;
    seVinkel: TSpinEdit;
    Label2: TLabel;
    btnClear: TButton;
    btnPrint: TButton;
    SavePictureDialog1: TSavePictureDialog;
    PrinterSetupDialog1: TPrinterSetupDialog;
    Label4: TLabel;
    procedure btnTegnClick(Sender: TObject);
    procedure seZoomChange(Sender: TObject);
    procedure seVinkelChange(Sender: TObject);
    procedure btnClearClick(Sender: TObject);
    procedure SaetKryds( center: TVingePkt; bredde: Integer);
    procedure FormResize(Sender: TObject);
    procedure btnGemJpegClick(Sender: TObject);
    procedure btnPrintClick(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }

  end;

var
  frmProfil: TfrmProfil;
  V: Real;
  zoom:integer;

implementation

uses Unit1,Unit3,Unit5;

{$R *.dfm}

function VingePkt( x, y: Real): TVingePkt;
begin
  Result.x := x;
  Result.y := y;
end;

function RotatePkt(pkt: TVingePkt; v, cx,cy: Real): TVingePkt;
const
  toPi = 2*Pi;
begin
  v := v / 360; // ingen grund til at beregne den 4 gange.
  Result.x := (pkt.x-cx)*cos(v*toPi) - (pkt.y-cy)*sin(v*toPi) + cx;
  Result.y := (pkt.y-cy)*cos(v*toPi) + (pkt.x-cx)*sin(v*toPi) + cy;
end;

// Tegner en linie på canvas fra pkt1 til pkt2.
procedure DrawLine( pkt1, pkt2: TVingePkt);
begin
  with frmProfil.Image1.Canvas do
  begin
    MoveTo( Round(pkt1.x), Round(pkt1.y));
    LineTo( Round(pkt2.x), Round(pkt2.y));

  end;
end;

// Tegn et kryds i Image1
procedure TfrmProfil.SaetKryds( center: TVingePkt; bredde: Integer);
var
  topLeft,
  topRight,
  botLeft,
  botRight: TVingePkt;
  gemtFarve:  TColor;
begin
  // skal bruge en halv
  // bredde fra center til hver side.
  bredde := bredde div 2;

  // Beregn hjoernepunkter, som var det
  // et kvadrat der skulle tegnes uden om center.
  topLeft.x := center.x - bredde;
  botLeft.x := topLeft.x;
  topLeft.y := center.y - bredde;
  topRight.y := topLeft.y;
  botRight.x := center.x + bredde;
  topRight.x := botRight.x;
  botRight.y := center.y + bredde;
  botLeft.y := botRight.y;

  // Roter krydset sammen med profilen.
  topLeft := RotatePkt( topLeft, frmProfil.seVinkel.Value, center.x, center.y);
  topRight := RotatePkt( topRight, frmProfil.seVinkel.Value, center.x, center.y);
  botLeft := RotatePkt( botLeft, frmProfil.seVinkel.Value, center.x, center.y);
  botRight := RotatePkt( botRight, frmProfil.seVinkel.Value, center.x, center.y);

  // gem den farve der normalt tegnes med.
  gemtFarve := frmProfil.Image1.Canvas.Pen.Color;
  // skift farve til roed.
  Image1.Canvas.Pen.Color := clRed;
  // tegn diagonal fra øverste ventre hjørne
  // til nederste højre.
  DrawLine( topLeft, botRight);
  // tegn digonal fra nederste venstre hjørne
  // til øverste højre hjørne.
  DrawLine( botLeft, topRight);
  // skift farve til det der normalt tegnes med.
  Image1.Canvas.Pen.Color := gemtFarve;
end;


procedure TfrmProfil.btnTegnClick(Sender: TObject);
var
  koord:  array[0..18] of TVingeKoord;
  cx,midY: Real;
  count: Integer;

begin

  fmProfilValg.StandartTekstNaca4415;
  midY := Image1.Height /1.5; // Midten af Image1

  cx := Round( Naca4415X[ High( Naca4415X) - 1 ] * zoom / 4);
  // zoom := Round( Image1.Width / X[High(X)])-1;
  // beregn "absolutte" koordinater (uden rotation).

  // tegn et kryds i (cx,midY).

  // Hvis du vil have krydset i en fast str. uanset profilets
  // str. skal du ikke gange med zoom...

  // beregn "absolutte" koordinater (uden rotation).
  koord[0].Pkt1 := VingePkt(0,midY);
  koord[0].Pkt2 := VingePkt(0,midY);
  for count := 1 to 18 do
  begin
    koord[count].Pkt1.x := Naca4415X[count]*zoom;
    koord[count].Pkt1.y := midY - Naca4415op[count]*zoom;
    koord[count].Pkt2.x := koord[count].Pkt1.x;
    koord[count].Pkt2.y := midY - Naca4415ned[count]*zoom;
  end;
  // rotér koordinater
  // vinklen bliver laest fra SpinEdit2. cy er midY. cx er midX,
  // (cx,cy) er centrum for rotation.
  for count := 0 to 18 do
  begin
    koord[count].Pkt1 := RotatePkt( koord[count].Pkt1, seVinkel.Value, cx, midY);
    koord[count].Pkt2 := RotatePkt( koord[count].Pkt2, seVinkel.Value, cx, midY);
  end;
  // tegn på canvas.
  for count := 0 to 17 do
  begin
    DrawLine( koord[count].Pkt1, koord[count+1].Pkt1);
    DrawLine( koord[count].Pkt2, koord[count+1].Pkt2);
    // Tegn 1/4 punktet
    end;
    // Hvis du vil have et større kryds, kan du ændre 2-tallet.
    SaetKryds( VingePkt( cx, midY), 2*zoom);
    // zoom := Round( Image1.Width / X[High(X)])-1;
    If (seZoom.Value = 0) then
        seZoom.Value:=7;
end;

procedure TfrmProfil.seZoomChange(Sender: TObject);
begin
zoom:= seZoom.Value;

if fmProfilValg.RadioButton1.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca4415;
  end else
if fmProfilValg.RadioButton2.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstFX72MS150B;
  end else
if fmProfilValg.RadioButton3.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca4412;
  end else
if fmProfilValg.RadioButton4.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca4412;
  end else
if fmProfilValg.RadioButton5.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca4421;
  end else
if fmProfilValg.RadioButton6.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca23012;
  end

end;

procedure TfrmProfil.seVinkelChange(Sender: TObject);
begin

V:= seVinkel.Value;

if fmProfilValg.RadioButton1.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNaca4415;
  end else
if fmProfilValg.RadioButton2.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstFX72MS150B;
  end else
if fmProfilValg.RadioButton3.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNACA4412;
  end else
if fmProfilValg.RadioButton4.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNACA4418;
  end else
if fmProfilValg.RadioButton5.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNACA4421;
  end else
if fmProfilValg.RadioButton6.Checked then  begin
  frmProfil.btnClear.Click;
  frmProfil.btnTegn.Click;
  fmProfilValg.StandartTekstNACA23012;
  end
end;

procedure TfrmProfil.btnClearClick(Sender: TObject);
var
  r:  TRect;  // Firkanten der definerer image-vinduet.
begin
  with Image1 do
  begin
    Picture := nil; // Fjern det billede der er der.
    // prøv at finde firkanten med windows-funktionen
    if not Windows.GetClientRect(Handle, r) then
      // ellers bare brug width / height af image.
      r := Rect( 0, 0, Width, Height);
    Canvas.FillRect( r); // fyld imagevinduet med hvid.
  end;
end;

procedure TfrmProfil.FormResize(Sender: TObject);
begin
  btnClear.Click; // Clear image1
  btnTegn.Click; // Gentegn profilen.
end;

procedure TfrmProfil.btnGemJpegClick(Sender: TObject);
var
  jpgFile: TJpegImage;
begin
  // Hvis der ikke er tegnet i Image1, saa...
  // hmmm... ved ikke om det virker ??
  if Image1.Picture.Bitmap = nil then
  begin
    ShowMessage( 'Der er ikke noget at gemme !');
    Exit;
  end;

  // Vis gem-dialog. Afslut hvis bruger trykker "annuller".
  if not SavePictureDialog1.Execute then Exit;

  // brug altid try...finally obj.free
  // efter var := obj.Create.
  // Så er du sikker på at det bliver frigivet, selvom noget skulle
  // gå galt undervejs !

  // Opret et JPG-billede.
  jpgFile := TJpegImage.Create;
  try
    // hvor meget skal der komprimeres.
    jpgFile.CompressionQuality := 85;
    // tildel bitmap fra image1.
    jpgFile.Assign( Image1.Picture.Bitmap);
    // lav bitmap om til jpeg format.
    jpgFile.JPEGNeeded;
    // comprimer billedet.
    jpgFile.Compress;
    // gem den på disk.
    jpgFile.SaveToFile( SavePictureDialog1.FileName);
  finally
    jpgFile.Free;
  end;
end;

procedure TfrmProfil.btnPrintClick(Sender: TObject);
var
  ScaleX, ScaleY: Integer;
  R: TRect;
begin
  if PrinterSetupDialog1.Execute then
  begin
    Printer.BeginDoc;  // **
    fmProfilValg.StandartTekstNaca4415;
  with Printer do
    try
      ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
      ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
      R := Rect(0, 0, Image1.Picture.Width * ScaleX,
      Image1.Picture.Height * ScaleY);
      Canvas.StretchDraw(R, Image1.Picture.Graphic);  // **
    finally
    EndDoc;  // **
  end;
end;

Med venlig hilsen
Monie Jacobsen
Avatar billede nop Nybegynder
20. april 2004 - 10:06 #1
du kunne jo hurtigt finde x/y-skalering-tilpasning som netop den printer du bruger nu har brug for før at 1=1 :)
det er: 134,4 / 152 = 0,8842105(osv) som du skal gange alle coordinater med.
Avatar billede monie Nybegynder
20. april 2004 - 11:18 #2
Hej
Jo det er rigtigt hvad du skriver, men hvis det er en ande computer og printer så har vi problemmet.

Se www.sunwind.dk/vingemenu.jpg

Der hvor der står "Størrelsesforhold" ønsker jeg når der i feltet
står 1:1 så er det, og vis det fylder mere skal forholdet kunne ændres
til f.eks 1:5 osv.

Det skal lige siges, at koderne her har jeg ikke selv skrevet.

Så hvis du kan se en løsning vil jeg meget gerne havde din hjælp.
Og vil meget gerne forhøje Point med 100 hvis du vil hjælpe?

Med venlig hilse
Monie Jacobsen
Avatar billede nop Nybegynder
20. april 2004 - 11:25 #3
ja skaleringstallet skulle så bruges i din strecth.

Jeg vil tro at det er et størrer problem end som så.
Har du undersøgt markedet for cad/cam udskrivnings programmer, de må kunne.
Kan pdf ?
Ellers må du lave et activeX som giver brugeren mulighed for at kalibrerer til hans egen printer, og som så husker opsæt på hans maskine.
Eller endnu bedre så en liste over printerer og deres tilpasnings-tal(både x og y sikkert), hvis ikke på listen så kalibrering.
Der må være en letterer løsning...:)
--nop
Avatar billede monie Nybegynder
20. april 2004 - 11:29 #4
Hvis jeg nu beregner en lille vinge, hvor hele profilet kan ses på skærmen
er det så svært et lave profil-tegningen 1:1  ??
Avatar billede nop Nybegynder
20. april 2004 - 11:34 #5
problemmet er at tegne en streg (eller andet) som er en bestemt fysisk størrelse og hvis man ved at en streg er 1 cm på skærmen så vil det (gennemsnitligt) blive ½cm hvis man dividerer dens længde(i pixels) med 2 !!!
Det har ikke noget med målestoksforhold at gøre såvidt jeg kunne forstår på dit spørgsmål, ville du ikke gerne være istand til at tegene på printeren hvor du 100% skal kunne styrrer fysisk størelse?
Ellers er det jo pære let, tallene skal jo bare skaleres 1:500 = gang alle tal med 0,002
Avatar billede monie Nybegynder
20. april 2004 - 11:43 #6
Det er rigtigt med printeren som du beskriver.
Og der er let, tallene skal jo bare skaleres 1:500 = gang alle tal med 0,002
For at undgå misforståelser:
Vil du prøve, at indskrive en kode for "skalering" tilpasset, hvor skaleringen kan justeres?
Jeg tro det vil lette forståelsen!
Avatar billede nop Nybegynder
20. april 2004 - 11:49 #7
procedure TfrmProfil.btnPrintClick(Sender: TObject);
var
  ScaleX, ScaleY: Integer;
  R: TRect;
begin
  if PrinterSetupDialog1.Execute then
  begin
    Printer.BeginDoc;  // **
    fmProfilValg.StandartTekstNaca4415;
  with Printer do
    try
      tilpasX:=0.881234; //fx men skal jo gerne igennem en dialog
      tilpasY:=0.881234; //
      ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
      ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
      R := Rect(0, 0, Image1.Picture.Width * ScaleX * tilpasX,
      Image1.Picture.Height * ScaleY * tilpasY);
      Canvas.StretchDraw(R, Image1.Picture.Graphic);  // **
    finally
    EndDoc;  // **
  end;
end;

Men jeg ville nok egentlig lave tilpasningen på selve linje-objecterne, (centrum og omrids) og så altid vise billedet 100%. Ihvertilfælde hvis billedet ikke skal publiseres. Man kan jo osse tegne streger på et printer-canvas, her vil det osse blive meget mere nøjagtigt, fordi en printer har størrer opløsning.
Avatar billede nop Nybegynder
20. april 2004 - 11:51 #8
hov du bruger div i udregnet dine scales - som er heltal, prøv med / som giver decimaler.
Det kan være det er det der er løsningen (men sikkert kun næsten).
--nop
Avatar billede monie Nybegynder
20. april 2004 - 11:57 #9
Hej nop
Det var rigtig flot, nu har jeg lidt at arbejde med! Mange tak.
Er det sådan nu du får Dine Poin at jeg kan følge op på denne trå
hvis der skulle værer nogle spørgsmål?

Send lige et svar så får du dine point nu1

Fortløbende mange tak.
Med venlig hilsen
Monie Jacobsen
Avatar billede monie Nybegynder
20. april 2004 - 12:10 #10
Vil du prøve, at rette koden jeg får fejl.
Du skrev:
hov du bruger div i udregnet dine scales - som er heltal, prøv med / som giver decimaler.
Avatar billede nop Nybegynder
20. april 2004 - 12:30 #11
Tak for ordene.

ret:
scaleX,scaleY: real; //skal jo kunne holde deimalerne

ScaleX := GetDeviceCaps(Handle, logPixelsX) / PixelsPerInch; //division der giver decimaler
ScaleY := GetDeviceCaps(Handle, logPixelsY) / PixelsPerInch;

Skal du ikke lige prøve at holde tråden åben lidt endnu?
Avatar billede monie Nybegynder
20. april 2004 - 15:30 #12
Sådan har jeg nu tildanne nedstående kode:

procedure TfrmProfil.btnPrintClick(Sender: TObject);
var
  scaleX,scaleY : real; //skal jo kunne holde deimalerne
  tilpasX, tilpasY : real;
  R: TRect;
begin
  if PrinterSetupDialog1.Execute then
  begin
    Printer.BeginDoc;  // **
    fmProfilValg.StandartTekstNaca4415;
  with Printer do
    try
      tilpasX:=0.881234; //fx men skal jo gerne igennem en dialog
      tilpasY:=0.881234; //
      ScaleX := GetDeviceCaps(Handle, logPixelsX) / PixelsPerInch; //division der giver decimaler
      ScaleY := GetDeviceCaps(Handle, logPixelsY) / PixelsPerInch;
      R := Rect(0, 0, Image1.Picture.Width * ScaleX * tilpasX,
      Image1.Picture.Height * ScaleY * tilpasY);****************Her opstår fejlen!!
     
    Canvas.StretchDraw(R, Image1.Picture.Graphic);  // **
    finally
    EndDoc;  // **
  end;
end;

Her fås fejmeddelsen:
[Error] Unit4.pas(335): There is no overloaded version of 'Rect' that can be called with these arguments
[Fatal Error] Project1.dpr(12): Could not compile used unit 'Unit4.pas'
Avatar billede nop Nybegynder
20. april 2004 - 15:34 #13
ja du skal nok skrive trunc(Image1.Picture.Width * ScaleX * tilpasX) og det samme med Y. trunc() laver et kommatal til et heltal og en integer/caridnal på samme tid.
(ikke samme som int()).
--nop
Avatar billede monie Nybegynder
20. april 2004 - 15:48 #14
Nu virker det tilsynladende!
Men længden har jeg målt til 162 hvor det skulle havde værret
134,4 mm

Se www.sunwind.dk/vingemenu.jpg

Størrelseforhold er jeg lidt udsikker på hvad det skal så på nu?
har du en ide her?
Avatar billede monie Nybegynder
20. april 2004 - 15:51 #15
Skal den havde en Default værdi?
Avatar billede nop Nybegynder
20. april 2004 - 15:53 #16
så skal du justerer vores tilpasX/y værdier, prøve at sætte 0.1 ind og osse fx 2.5 så ser du nok tråden.
--nop
Avatar billede nop Nybegynder
20. april 2004 - 15:56 #17
eller sæt 1.0 ind og mål og genberegn tilpas faktorene.
Avatar billede monie Nybegynder
20. april 2004 - 16:10 #18
Jeg kan ikke komme under 150 mm
Avatar billede nop Nybegynder
20. april 2004 - 16:12 #19
så er det fordi strecth ikke kan gøre billedet mindre ?
Er der en shrinkDraw så skal den bruges når billedet skal gøres mindre, og strecth stadig hvis billedet skal gøres størrer
Avatar billede monie Nybegynder
20. april 2004 - 16:18 #20
Hurra, Hurra
Ved at starte med at sæt 1.0 og så 134.4/185 =0,726486486
Så lykkes det at få udprintet i rigtig størrelseforhold.

Mange tak nop
Avatar billede nop Nybegynder
20. april 2004 - 16:20 #21
fint jo, velbekomme :)
Avatar billede monie Nybegynder
20. april 2004 - 16:25 #22
Men når jeg forsøger, at udprinte en anden størrer profil, så fås 134 hvor det skulle havde været 168.0 mm
Avatar billede monie Nybegynder
20. april 2004 - 16:34 #23
Det ser ud til, at selom det er samme vingeprofil, men med forskellige vingebrede,
så skal der for vær profil laves en beregning.
Avatar billede monie Nybegynder
20. april 2004 - 16:42 #24
Måske skal der laves en beregning for hver profil, noget i denne retning:
tilpasX:=profilbredde[n]/????;
tilpasY:=profilbredde[n]/????; ;

har du et forslag?

Her beregnes profilbredden:

procedure TfmProfilValg.RadioButton1Click(Sender: TObject);
var
  n:  Integer;
begin
Memo1.Clear;
frmProfil.seZoom.Value:=0;
frmProfil.seVinkel.Value:=0;
Memo1.Font.Name:='courier new';
Memo1.Font.Size:=9;

  for n:=1 to 18 do begin
    Naca4415X[n]:= 0.00;  Naca4415OP[n] := 0.00;  Naca4415NED[n] := 0.00;
  end;
  for n:=1 to 18 do
  Naca4415X[0]  :=  0.00;  Naca4415OP[0]  :=  0.00;  Naca4415NED[0]  :=  0.00;
  Naca4415X[1]  :=  1.25;  Naca4415OP[1]  :=  3.07;  Naca4415NED[1]  :=  -1.79;
  Naca4415X[2]  :=  2.50;  Naca4415OP[2]  :=  4.18;  Naca4415NED[2]  :=  -2.48;
  Naca4415X[3]  :=  5.00;  Naca4415OP[3]  :=  5.74;  Naca4415NED[3]  :=  -3.27;
  Naca4415X[4]  :=  7.50;  Naca4415OP[4]  :=  6.91;  Naca4415NED[4]  :=  -3.71;
  Naca4415X[5]  :=  10.00;  Naca4415OP[5]  :=  7.84;  Naca4415NED[5]  :=  -3.98;
  Naca4415X[6]  :=  15.00;  Naca4415OP[6]  :=  9.27;  Naca4415NED[6]  :=  -4.18;
  Naca4415X[7]  :=  20.00;  Naca4415OP[7]  :=  10.25;  Naca4415NED[7]  :=  -4.15;
  Naca4415X[8]  :=  25.00;  Naca4415OP[8]  :=  10.92;  Naca4415NED[8]  :=  -3.98;
  Naca4415X[9]  :=  30.00;  Naca4415OP[9]  :=  11.25;  Naca4415NED[9]  :=  -3.75;
  Naca4415X[10] :=  40.00;  Naca4415OP[10] :=  11.25;  Naca4415NED[10] :=  -3.25;
  Naca4415X[11] :=  50.00;  Naca4415OP[11] :=  10.53;  Naca4415NED[11] :=  -2.72;
  Naca4415X[12] :=  60.00;  Naca4415OP[12] :=  9.30;  Naca4415NED[12] :=  -2.14;
  Naca4415X[13] :=  70.00;  Naca4415OP[13] :=  7.63;  Naca4415NED[13] :=  -1.55;
  Naca4415X[14] :=  80.00;  Naca4415OP[14] :=  5.55;  Naca4415NED[14] :=  -1.03;
  Naca4415X[15] :=  90.00;  Naca4415OP[15] :=  3.08;  Naca4415NED[15] :=  -0.57;
  Naca4415X[16] :=  95.00;  Naca4415OP[16] :=  1.67;  Naca4415NED[16] :=  -0.35;
  Naca4415X[17] := 100.00;  Naca4415OP[17] :=  0.16;  Naca4415NED[17] :=  -0.16;
  Naca4415X[18] := 100.00;  Naca4415OP[18] :=  0.00;  Naca4415NED[18] :=  -0.00;

  Rkonstant:= serRadius.Value/100;
  //Sektion[n]:= (Rkonstant/10)*radius;

  //Memo1.Lines.Add('Rkonstant r/R: '+  FormatFloat('#0',Rkonstant));
  Memo1.Lines.Add('VingeProfil Type NACA 4415 ');
  Memo1.Lines.Add('VingeRadius '+  FormatFloat('#0',radius)+' mm');
  Memo1.Lines.Add('Afstand fra vingerod '+ FormatFloat('#0',(Rkonstant)* radius)+' mm');
  Memo1.Lines.Add('VingeBredde '+ FormatFloat('#0.0',(5.6*radius)/(i*1.0*Rkonstant*(power(5,2))))+' mm');
  Memo1.Lines.Add(' ');

  for n:=1 to 18 do
  begin

  //SektionBredde[n]:= (16*pi*power(5000,2))/(9*i*1.0*2500*(power(5,2)));
  SektionBredde[n]:= (5.6*radius)/(i*1.0*Rkonstant*(power(5,2)));

    X[n]  := (SektionBredde[n] * Naca4415X[n]);
    Yop[n] := (SektionBredde[n] * Naca4415OP[n]);
    Yned[n]:= (SektionBredde[n] * Naca4415NED[n]);

    sx:= Format('%8.1f',[X[n]/100]);
    sYo:= Format('%8.1f',[Yop[n]/100]);
    sYn:= Format('%8.1f',[Yned[n]/100]);

    Memo1.Lines.Add('X[Hen]:'+sx+'  Y[op]:'+sYo+'  Y[Ned]:'+sYn);

    Panel1.Caption:=(' Vingebredde: '+ FormatFloat('#,##0.00;;Zero', SektionBredde[n])+' mm.');
    // Afstanden fra rod til NACA-profilet beregnes
    Label3.Caption:=('Afstand fra vingerod '+ FormatFloat('#0',(Rkonstant)* radius)+' mm');
    //SendMessage(Memo1.Handle, EM_LINESCROLL, 0, -30);
    Linescroll_Op;
    end;
end;
Avatar billede monie Nybegynder
20. april 2004 - 18:42 #25
Har fået det til at virke!
Ved at lave denne kode, hvor selve profiltypen bliver beregnet, alså profilbredden.

Profilbredde[18]:= (5.6*radius)/(i*1.0*Rkonstant*(power(5,2)));
Profilbreddemaal:= FloatToStr(Profilbredde[18]);

Og lave dette i udskrivningen delen.

tilpasX:=Profilbredde[18]/185;
tilpasY:=Profilbredde[18]/185;

Så passer målene ved forskellige bredder og profiltyper. Hurra

Se lige her:
www.sunwind.dk/vingemenu.jpg

Denne gennemgående streg hvordan laves den?
Den skal værer fast og skal således ikke roteres,
men værer lidt længer i begge ender af profilet. Som kan andtage forskellige bredder!

Håber du stadig har mod på at hjælpe mig.
Jeg syndtes det er meget, meget spændende at få dette til at virke.
Og ikke mindst intresser jeg mig, meget for vedvarende energikilder og da også
husstandsmøller, også kaldes varmemøller.
Se: Min hjemmeside for vedvarende energi: www.sunwind.dk

Med venlig hilsen
Monie Jacobsen
Avatar billede nop Nybegynder
20. april 2004 - 18:52 #26
Jeg svarede generelt mht skaleringen, det var nemt.
Men stregne er vel profilbreden + nogle %.
Og den skal ikke igennem rotationen så.
Man kunne nok udregne koordinat for start og længde og sætte en drawLine ind sidst i tegne proceduren.
Der kunne jo osse være andre der ville hjælpe.
Held og lykke med dine projekter.
Avatar billede monie Nybegynder
20. april 2004 - 18:59 #27
Ok nop
Din hjælp har hjulpet mig meget. Tak
Men håber også, der er andre, der kan hjælpe med en løsning, på det sidste indlæg.

Med venlig hilsen
Monie Jacobsen
Avatar billede monie Nybegynder
26. april 2004 - 07:21 #28
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester