You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.7 KiB
200 lines
5.7 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkTriangularTexture.cxx,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
#include "vtkTriangularTexture.h"
|
|
|
|
#include "vtkImageData.h"
|
|
#include "vtkMath.h"
|
|
#include "vtkInformation.h"
|
|
#include "vtkInformationVector.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkStreamingDemandDrivenPipeline.h"
|
|
#include "vtkPointData.h"
|
|
#include "vtkUnsignedCharArray.h"
|
|
|
|
vtkCxxRevisionMacro(vtkTriangularTexture, "$Revision: 1.30 $");
|
|
vtkStandardNewMacro(vtkTriangularTexture);
|
|
|
|
// Instantiate object with XSize and YSize = 64; the texture pattern =1
|
|
// (opaque at centroid); and the scale factor set to 1.0.
|
|
|
|
vtkTriangularTexture::vtkTriangularTexture()
|
|
{
|
|
this->XSize = this->YSize = 64;
|
|
this->TexturePattern = 1;
|
|
this->ScaleFactor = 1.0;
|
|
this->SetNumberOfInputPorts(0);
|
|
}
|
|
|
|
void vtkOpaqueAtElementCentroid (int XSize, int YSize, double ScaleFactor,
|
|
vtkUnsignedCharArray *newScalars)
|
|
{
|
|
int i, j;
|
|
double opacity;
|
|
double point[3];
|
|
double XScale = XSize + 1.0;
|
|
double YScale = YSize + 1.0;
|
|
unsigned char AGrayValue[2];
|
|
double dist, distToV2, distToV3;
|
|
double v1[3] = {0.0, 0.0, 0.0};
|
|
double v2[3] = {1.0, 0.0, 0.0};
|
|
double v3[3] = {0.5, sqrt(3.0)/2.0, 0.0};
|
|
|
|
point[2] = 0.0;
|
|
AGrayValue[0] = AGrayValue[1] = 255;
|
|
|
|
for (j = 0; j < YSize; j++)
|
|
{
|
|
for (i = 0; i < XSize; i++)
|
|
{
|
|
point[0] = i / XScale;
|
|
point[1] = j / YScale;
|
|
dist = vtkMath::Distance2BetweenPoints (point, v1);
|
|
distToV2 = vtkMath::Distance2BetweenPoints (point, v2);
|
|
if (distToV2 < dist)
|
|
{
|
|
dist = distToV2;
|
|
}
|
|
distToV3 = vtkMath::Distance2BetweenPoints (point, v3);
|
|
if (distToV3 < dist)
|
|
{
|
|
dist = distToV3;
|
|
}
|
|
|
|
opacity = sqrt(dist) * ScaleFactor;
|
|
if (opacity < .5)
|
|
{
|
|
opacity = 0.0;
|
|
}
|
|
if (opacity > .5)
|
|
{
|
|
opacity = 1.0;
|
|
}
|
|
AGrayValue[1] = (unsigned char) (opacity * 255);
|
|
newScalars->SetValue ((XSize*j + i)*2, AGrayValue[0]);
|
|
newScalars->SetValue ((XSize*j + i)*2 + 1, AGrayValue[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkOpaqueAtVertices (int XSize, int YSize, double ScaleFactor,
|
|
vtkUnsignedCharArray *newScalars)
|
|
{
|
|
int i, j;
|
|
double opacity;
|
|
double point[3];
|
|
double XScale = XSize + 1.0;
|
|
double YScale = YSize + 1.0;
|
|
unsigned char AGrayValue[2];
|
|
double dist, distToV2, distToV3;
|
|
double v1[3] = {0.0, 0.0, 0.0};
|
|
double v2[3] = {1.0, 0.0, 0.0};
|
|
double v3[3] = {0.5, sqrt(3.0)/2.0, 0.0};
|
|
|
|
point[2] = 0.0;
|
|
AGrayValue[0] = AGrayValue[1] = 255;
|
|
|
|
for (j = 0; j < YSize; j++)
|
|
{
|
|
for (i = 0; i < XSize; i++)
|
|
{
|
|
point[0] = i / XScale;
|
|
point[1] = j / YScale;
|
|
dist = vtkMath::Distance2BetweenPoints (point, v1);
|
|
distToV2 = vtkMath::Distance2BetweenPoints (point, v2);
|
|
if (distToV2 < dist)
|
|
{
|
|
dist = distToV2;
|
|
}
|
|
distToV3 = vtkMath::Distance2BetweenPoints (point, v3);
|
|
if (distToV3 < dist)
|
|
{
|
|
dist = distToV3;
|
|
}
|
|
|
|
opacity = sqrt(dist) * ScaleFactor;
|
|
if (opacity < .5)
|
|
{
|
|
opacity = 0.0;
|
|
}
|
|
if (opacity > .5)
|
|
{
|
|
opacity = 1.0;
|
|
}
|
|
opacity = 1.0 - opacity;
|
|
AGrayValue[1] = (unsigned char) (opacity * 255);
|
|
newScalars->SetValue ((XSize*j + i)*2, AGrayValue[0]);
|
|
newScalars->SetValue ((XSize*j + i)*2 + 1, AGrayValue[1]);
|
|
}
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
int vtkTriangularTexture::RequestInformation (
|
|
vtkInformation * vtkNotUsed(request),
|
|
vtkInformationVector** vtkNotUsed( inputVector ),
|
|
vtkInformationVector *outputVector)
|
|
{
|
|
// get the info objects
|
|
vtkInformation* outInfo = outputVector->GetInformationObject(0);
|
|
|
|
int wExt[6] = {0,this->XSize -1, 0, this->YSize - 1, 0,0};
|
|
|
|
outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(),wExt,6);
|
|
vtkDataObject::SetPointDataActiveScalarInfo(outInfo, VTK_UNSIGNED_CHAR, 2);
|
|
return 1;
|
|
}
|
|
|
|
void vtkTriangularTexture::ExecuteData(vtkDataObject *outp)
|
|
{
|
|
vtkImageData *output = this->AllocateOutputData(outp);
|
|
vtkUnsignedCharArray *newScalars =
|
|
vtkUnsignedCharArray::SafeDownCast(output->GetPointData()->GetScalars());
|
|
|
|
if (this->XSize*this->YSize < 1)
|
|
{
|
|
vtkErrorMacro(<<"Bad texture (xsize,ysize) specification!");
|
|
return;
|
|
}
|
|
|
|
switch (this->TexturePattern)
|
|
{
|
|
case 1: // opaque at element vertices
|
|
vtkOpaqueAtVertices (this->XSize, this->YSize,
|
|
this->ScaleFactor, newScalars);
|
|
break;
|
|
|
|
case 2: // opaque at element centroid
|
|
vtkOpaqueAtElementCentroid (this->XSize, this->YSize,
|
|
this->ScaleFactor, newScalars);
|
|
break;
|
|
|
|
case 3: // opaque in rings around vertices
|
|
vtkErrorMacro(<<"Opaque vertex rings not implemented");
|
|
break;
|
|
}
|
|
}
|
|
|
|
void vtkTriangularTexture::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "XSize:" << this->XSize << "\n";
|
|
os << indent << "YSize:" << this->YSize << "\n";
|
|
|
|
os << indent << "Texture Pattern:" << this->TexturePattern << "\n";
|
|
|
|
os << indent << "Scale Factor:" << this->ScaleFactor << "\n";
|
|
}
|
|
|
|
|