我最近問了一個關于如何動態處理元素 Edit1 的問題,現在我想問一些關于值的問題,這些值是我從動態陣列中收到的。首先,我嘗試將影像劃分為多個扇區:
const n=20;
unsigned short i, j, line_length, w = Image1->Width, h = Image1->Height, l = Left Image1->Left, t = Top Image1->Top;
unsigned short border = (Width-ClientWidth)/2, topborder = Height-ClientHeight-border;
Image1->Canvas->Pen->Color = clRed;
for (i = 0; i <= n; i )
{
Image1->Canvas->MoveTo(0, 0);
line_length = w * tan(M_PI/2*i/n);
if (line_length <= h)
Image1->Canvas->LineTo(w, line_length);
else
{
line_length = h * tan(M_PI/2*(1-1.*i/n));
Image1->Canvas->LineTo(line_length, h);
}
}
然后我使用區域來計算每個扇區中的黑點,我想為元素 Memo 添加值:
HRGN region[n];
TPoint points[3];
points[0] = Point(l border, t topborder);
for (i = 0; i < n; i )
{
for (j = 0; j <= 1; j )
{
line_length = w * tan(M_PI/2*(i j)/n);
if (line_length <= h)
points[j 1] = Point(l border w, t topborder line_length);
else
{
line_length = h * tan(M_PI/2*(1-1.*(i j)/n));
points[j 1] = Point(l border line_length, t topborder h);
}
}
region[i] = CreatePolygonRgn(points, 3, ALTERNATE); // or WINDING ?? as u want
}
Byte k;
unsigned __int64 point_count[n] = {0}, points_count = 0;
for(j = 0; j < h; j )
for (i = 0; i < w; i )
if (Image1->Canvas->Pixels[i][j] == clBlack)
{
points_count ;
for (k = 0; k < n; k )
if (PtInRegion(region[k], l border i, t topborder j))
point_count[k] ;
}
unsigned __int64 sum = 0;
for (i = 0; i < n; i )
{
sum = point_count[i];
Memo1->Lines->Add(point_count[i]);
}
當我收到一個人的建議時,為了使用 TEdit 分配一個陣列來指定我應該使用的陣列計數,例如 DynamicArray:
#include <sysdyn.h>
DynamicArray<HRGN> region;
...
int n = Edit1-> Text.ToInt();
region.Length = n;
我對 point_count 陣列進行了相同的更改:
Byte k;
DynamicArray<unsigned __int64> point_count;
point_count.Length = n;
unsigned __int64 /*point_count[n] = {0},*/ points_count = 0;
...
問題是,如果我動態或靜態(n = 20)執行此操作,我會收到不同的值。
靜態:

動態:

uj5u.com熱心網友回復:
問題是,如果我動態或靜態(n = 20),我會收到不同的值
訪問靜態陣列和動態陣列的元素沒有任何區別。你的問題一定在別處。
例如,您的靜態代碼將所有陣列元素初始化為 0,但您的動態代碼沒有這樣做,因此在您的回圈之前它們將具有隨機值,然后增加它們。
嘗試這個:
DynamicArray<unsigned __int64> point_count;
point_count.Length = n;
for(int i = 0; i < n; i) {
point_count[i] = 0;
}
...
或者:
DynamicArray<unsigned __int64> point_count;
point_count.Length = n;
ZeroMemory(&point_count[0], sizeof(unsigned __int64) * n);
...
此外,使用該Image1->Canvas->Pixels[][]屬性非常慢。考慮使用該Image1->Picture->Bitmap->ScanLine[]屬性來更快地訪問原始像素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/329451.html
標籤:C 数组 图片 时间:2019-05-06 标签:c builder 地区
